设计模式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---设计模块(单例的变形)(多例)的更多相关文章

  1. 详略。。设计模式2——单例变形(多例).。。。studying

    ★ 缓存在单例中的使用("单例+缓存"技术) 缓存在编程中使用非常频繁,有着非常关键的数据,它可以帮助程序实现以空间换取时间, 通常被设计成整个应用程序所共享的一个空间,现要求实现 ...

  2. Java 多线程之单例设计模式

    转载:https://segmentfault.com/a/1190000007504892 概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍两种:懒汉式单例.饿汉 ...

  3. 设计模式(java) 单例模式 单例类

    ·单例类 单实例类,就是这个类只能创建一个对象,保证了对象实例的唯一性. 1.单例模式( Singleton Pattern) 是一个比较简单的模式, 其定义如下:Ensure a class has ...

  4. Java单例设计模式和多例设计模式

    单例设计模型 教学视频链接:https://edu.aliyun.com/course/1011 1,private不可以在类外部访问,但可以在内部访问 2,此时Singleton类内部的instan ...

  5. 再看 Java 中的单例

    此前面试遇到了单例问题,本以为已经背的滚瓜烂熟,没想到被问单例如何避免被反射和序列化破坏,虽然后来还是等到了通知,但还是复习一下单例的实现方式,并学习防止反射和序列化破坏的手段. 基本实现方式 其他相 ...

  6. Java设计模式之单例

    一.Java中的单例: 特点: ① 单例类只有一个实例 ② 单例类必须自己创建自己唯一实例 ③ 单例类必须给所有其他对象提供这一实例 二.两种模式: ①懒汉式单例<线程不安全> 在类加载时 ...

  7. Java复习11. 单例编程

    Java复习11. 单例编程 1.最简单的写法,那个方式是线程不安全的 public class Singleton {     private static Singleton instance; ...

  8. Java 9 模块解耦的设计策略

    1. 概述 Java 平台模块系统 (Java Platform Module System,JPMS)提供了更强的封装.更可靠且更好的关注点分离. 但所有的这些方便的功能都需要付出代价.由于模块化的 ...

  9. Spring 为啥默认把bean设计成单例的?

    熟悉Spring开发的朋友都知道Spring提供了5种scope分别是singleton.prototype.request.session.global session. 如下图是官方文档上的截图, ...

随机推荐

  1. 关于Android Canvas.drawText方法中的坐标参数的正确解释

    canvas.drawText("www.jcodecraeer.com", x, y, paint);  x和y参数是指定字符串中心的坐标吗?还是左上角的坐标?这个问题的直观印象 ...

  2. CentOS 6.3下部署LVS(NAT)+keepalived实现高性能高可用负载均衡【转】

    CentOS 6.3下部署LVS(NAT)+keepalived实现高性能高可用负载均衡   一.简介 VS/NAT原理图: 二.系统环境 实验拓扑: 系统平台:CentOS 6.3 Kernel:2 ...

  3. java Serializable和Externalizable序列化反序列化详解--转

    一.什么是序列化? “对象序列化”(Object Serialization)是 Java1.1就开始有的特性. 简单地说,就是可以将一个对象(标志对象的类型)及其状态转换为字节码,保存起来(可以保存 ...

  4. Java基础知识强化81:Math类random()方法之获取任意范围的随机数案例(面试题)

    1. 需求:设计一个方法,可以实现获取任意范围内的随机数 分析:使用方法random()如下: public static double random() 注:Returns a pseudo-ran ...

  5. ·数据库基本内容回顾-day16.06.30

    一. 模式的定义和删除  ---创建了一个模式,就创建了一个数据库命名空间,一个框架.cascade.restrict create schema<模式名> authorization & ...

  6. linux批量执行工具omnitty使用方法

    一.omnitty概述 在生产环境中,可能会有多台linux主机.运维人员可能会对多台主机进行同样的操作,例:同时在多台主机上添加一个user或查看所有主机的硬件信息,如果没有批量操作工具,设备少于2 ...

  7. LA 6450 Social Advertising

    [题目] 给一个无向图,每当对某个点操作,该点以及与该点相连的点都获得标记,问标记所有点至少需要操作多少次 输入 第一行为T,表示测试数据组数 每组测试数据第一行为n(1<=n<=20)表 ...

  8. linux中内核的一个不错的参数somaxconn

    导读:在linux中,/proc/sys/net/core/somaxconn这个参数,linux中内核的一个不错的参数somaxconn 看下其解析: 对于一个TCP连接,Server与Client ...

  9. ICSharpCode.SharpZipLib实现压缩解压缩

    最近,在项目中经常需要处理压缩和解压缩文件的操作.经过查找,发现了ICSharpCode.SharpZipLib.dll ,这是一个完全由c#编写的Zip, GZip.Tar . BZip2 类库,可 ...

  10. (转)SQL流程控制语句学习(二):begin…end if…else case

    1.begin…end 语法: begin {sql语句或语句块} end 注意:begin 和end要成对使用 2.if…else 语法: if  布尔表达式 {sql语句或语句块} else  布 ...