Java---设计模块(单例的变形)(多例)
设计模式1——单例变形(多例)
★ 缓存在单例中的使用
缓存在编程中使用很频繁,有着非常重要的作用,它能够帮助程序实现以空间换取时间,通常被设计成整个应用程序所共享的一个空间,现要求实现一个用缓存存放单例对象的类。
说明:该缓存中可以存放多个该类对象,每个对象以一个key值标识,key值相同时所访问的是同一个单例对象。
给一个key值标识:
package cn.hncu.pattern.mulitition;
import java.util.HashMap;
import java.util.Map;
public class A {
private static final Map<String, A> map = new HashMap<String, A>();
public A() {
}//private也是可以的,这不是关键,关键是map是私有的,这个是集合的单例
public static A getInstance(String key){
A a = map.get(key);
if(a==null){
a = new A();
map.put(key, a);
}
return a;
}
}
测试:
package cn.hncu.pattern.mulitition;
public class Test {
public static void main(String[] args) {
Atest();
}
private static void Atest() {
A a1 = A.getInstance("hncu1");
System.out.println(a1);
A a2 = A.getInstance("hncu2");
System.out.println(a2);
A a3 = A.getInstance("hncu1");
System.out.println(a3);
A a4 = A.getInstance("hncu2");
System.out.println(a4);
A a5 = A.getInstance("hncu1");
System.out.println(a5);
}
}
测试输出结果;
cn.hncu.pattern.mulitition.A@11dba45
cn.hncu.pattern.mulitition.A@b03be0
cn.hncu.pattern.mulitition.A@11dba45
cn.hncu.pattern.mulitition.A@b03be0
cn.hncu.pattern.mulitition.A@11dba45
可以发现:a1,a3,a5的地址的值是相等的,a2,a4是相等的。
通过Buffer类调用Book类的单例:
Book类:
package cn.hncu.pattern.mulitition;
public class Book {
private String name;
private int id;
private double price;
private String details;
private static int cont=0;
public Book() {
id=cont++;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getDetails() {
return details;
}
public void setDetails(String details) {
this.details = details;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + id;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Book other = (Book) obj;
if (id != other.id)
return false;
return true;
}
@Override
public String toString() {
return "Book [id=" + id + "]";
}
}
Buffer类:
package cn.hncu.pattern.mulitition;
import java.util.HashMap;
import java.util.Map;
public class Buffer {
private static final Map<String, Book> map = new HashMap<String, Book>();
public Buffer() {
}//private也是可以的,这不是关键,关键是map是私有的,这个是集合的单例
public static Book getInstance(String key){
Book a = map.get(key);
if(a==null){
a = new Book();
map.put(key, a);
}
return a;
}
}
测试类;
package cn.hncu.pattern.mulitition;
public class Test {
public static void main(String[] args) {
Buffertest();
}
private static void Buffertest() {
Book bk1 = Buffer.getInstance("hncu1");
System.out.println(bk1);
Book bk2 = Buffer.getInstance("hncu2");
System.out.println(bk2);
Book bk3 = Buffer.getInstance("hncu3");
System.out.println(bk3);
Book bk4 = Buffer.getInstance("hncu2");
System.out.println(bk4);
Book bk5= Buffer.getInstance("hncu1");
System.out.println(bk5);
}
}
输出结果:
Book [id=0]
Book [id=1]
Book [id=2]
Book [id=1]
Book [id=0]
★ 单例变形——多例模式
把上面缓存的单例实现,做成一个能够控制对象个数的共享空间,供整个应用程序使用。在缓存中维护指定个数的对象,每个对象的key值由该类内部指定,有外部请求时直接返回其中一个对象出去。
说明:相当于维护一个指定数量的对象池,当请求个数超过控制的总数时,开始循环重复使用 。
package cn.hncu.pattern.mulitition.multi;
import java.util.HashMap;
import java.util.Map;
public class A {
private static final Map<Integer, A> map= new HashMap<Integer, A>();
private static final int MAX=3;//控制容器中所能使用对象的总个数
private static int cont = 1;//代表池中目前将要被使用的对象的序号
public static A getInstance(){
A a = map.get(cont);
if(a==null){
a=new A();
map.put(cont, a);
}
cont++;
if(cont>MAX){
cont=1;
}
return a;
}
}
测试的类:
package cn.hncu.pattern.mulitition;
public class Test {
public static void main(String[] args) {
Atest2();
}
private static void Atest2() {
System.out.println(cn.hncu.pattern.mulitition.multi.A.getInstance());
System.out.println(cn.hncu.pattern.mulitition.multi.A.getInstance());
System.out.println(cn.hncu.pattern.mulitition.multi.A.getInstance());
System.out.println(cn.hncu.pattern.mulitition.multi.A.getInstance());
System.out.println(cn.hncu.pattern.mulitition.multi.A.getInstance());
System.out.println(cn.hncu.pattern.mulitition.multi.A.getInstance());
}
}
输出结果:
cn.hncu.pattern.mulitition.multi.A@18a49e0
cn.hncu.pattern.mulitition.multi.A@1f82982
cn.hncu.pattern.mulitition.multi.A@16d2633
cn.hncu.pattern.mulitition.multi.A@18a49e0
cn.hncu.pattern.mulitition.multi.A@1f82982
cn.hncu.pattern.mulitition.multi.A@16d2633
可以看到: 123行的输出个不相同,
第4行的地址和第一行的相同,
第5行的地址和第二行的相同,
第6行的地址和第三行的相同。
依次类推,循环节点为3.
Java---设计模块(单例的变形)(多例)的更多相关文章
- 详略。。设计模式2——单例变形(多例).。。。studying
★ 缓存在单例中的使用("单例+缓存"技术) 缓存在编程中使用非常频繁,有着非常关键的数据,它可以帮助程序实现以空间换取时间, 通常被设计成整个应用程序所共享的一个空间,现要求实现 ...
- Java 多线程之单例设计模式
转载:https://segmentfault.com/a/1190000007504892 概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍两种:懒汉式单例.饿汉 ...
- 设计模式(java) 单例模式 单例类
·单例类 单实例类,就是这个类只能创建一个对象,保证了对象实例的唯一性. 1.单例模式( Singleton Pattern) 是一个比较简单的模式, 其定义如下:Ensure a class has ...
- Java单例设计模式和多例设计模式
单例设计模型 教学视频链接:https://edu.aliyun.com/course/1011 1,private不可以在类外部访问,但可以在内部访问 2,此时Singleton类内部的instan ...
- 再看 Java 中的单例
此前面试遇到了单例问题,本以为已经背的滚瓜烂熟,没想到被问单例如何避免被反射和序列化破坏,虽然后来还是等到了通知,但还是复习一下单例的实现方式,并学习防止反射和序列化破坏的手段. 基本实现方式 其他相 ...
- Java设计模式之单例
一.Java中的单例: 特点: ① 单例类只有一个实例 ② 单例类必须自己创建自己唯一实例 ③ 单例类必须给所有其他对象提供这一实例 二.两种模式: ①懒汉式单例<线程不安全> 在类加载时 ...
- Java复习11. 单例编程
Java复习11. 单例编程 1.最简单的写法,那个方式是线程不安全的 public class Singleton { private static Singleton instance; ...
- Java 9 模块解耦的设计策略
1. 概述 Java 平台模块系统 (Java Platform Module System,JPMS)提供了更强的封装.更可靠且更好的关注点分离. 但所有的这些方便的功能都需要付出代价.由于模块化的 ...
- Spring 为啥默认把bean设计成单例的?
熟悉Spring开发的朋友都知道Spring提供了5种scope分别是singleton.prototype.request.session.global session. 如下图是官方文档上的截图, ...
随机推荐
- struts开发<struts中的action详细配置. 二>
在eclipse中新建项目StrutsDemo1[struts的配置见]struts开发<在eclipse中配置struts. 一> 详细文件夹结构例如以下 第一种配置方法 新建UserA ...
- Robotium API -- 等待执行的方法sleep、waitFor
测试中经常出现明明有控件或者文本,但是由于界面没有载入完成或者其他原因导致assert判断的结果失败.或者两次执行,一次成功,一次失败的情况.所以需要加入这些等待某些控件或者文本载入的方法,以加强程序 ...
- Android消息机制(2)
在Android 中,线程内部或者线程之间进行信息交互时经常会使用消息,这些基础的东西如果我们熟悉其内部的原理,将会使我们容易.更好地架构系统,避免一些低级的错误. 下面我们分析下程序的运行过程: 1 ...
- C# 将MSMQ消息转换成Json格式 【优化】
C# 将MSMQ消息转换成Json格式 [优化] 转换函数: private string ConvertToJSON(string label, string body) { //TODO: co ...
- C++虚函数及虚函数表解析
一.背景知识(一些基本概念) 虚函数(Virtual Function):在基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数.纯虚函数(Pure Virtual Functio ...
- SVN版本日志对话框命令使用指南
日志使用指南 http://tortoisesvn.net/docs/nightly/TortoiseSVN_zh_CN/tsvn-dug-showlog.html
- 常用的CSS属性
1.CSS背景属性(background) 属性 描述 background 在一个声明中设置所有的背景属性 background-attachment 设置背景图像是否固定或者随着页面的其余部分滚动 ...
- 关于导出oracle多个表的建表语句DLL,生成.sql语句。
--('TABLE','LINE','ODS_XX')这里面的表和用户都需要大写.如果表名用户名不大写会报这个错误:对象 "emp" 属于类型 TABLE, 在方案 "s ...
- 武汉科技大学ACM:1005: 华科版C语言程序设计教程(第二版)例题5.8
Problem Description 老师给小豪出了一道题目:给你两个整数x和n(-10<=x<=10,1<=n<=10),让你求出x^1+x^2+x^3+……+x^n的结果 ...
- Libevent源码分析(一):最小堆
Libevent中的timeout事件是使用最小堆来管理维护的.代码位于<minheap-internal.h>. 看函数命名和代码风格应该是一个C++程序员,函数名都挺好懂的,只是下面这 ...