单例模式
模式定义
单例模式:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为实例类,它提供全局访问的方法,是一种对象创建型模式。
模式结构图

模式分析
单例模式:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,只包含一个角色,就是单例类Singleton,单例类拥有一个私有构造函数,确保用户无法通过new关键字直接实例化,除此之外,该模式中还包括一个静态私有成员变量和静态的公有的工厂方法,该工厂方法负责检验实例的存在性并实例化自己,以确保只有一个实例被创建。
优点:
(1)提供了对唯一实例的受控访问,共享。
(2)节约系统资源,系统内存中只有一个对象。
(3)允许可变数目的实例,基于单例模式我们可以进行扩展,使用与单例模式控制相似的方法来获得指定个数的对象实例。
缺点:
(1)由于没有抽象层。单例类的扩展有很大的困难。
(2)单例类的职责过重,在一定程度上违背了“单一职责原则”,既有工厂方法,又有业务方法。
(3)滥用单例模式将带来一些负面问题。
身份证案例
身份证证号单例类
package com.zck.singledemo;
//身份证号码实体类
public class IdentifyCardNo {
private static IdentifyCardNo instance = null;
private String no;
//构造函数
private IdentifyCardNo(){}
public static IdentifyCardNo getInstance() {
if (instance == null) {
System.out.println("第一次办理身份证");
instance = new IdentifyCardNo();
instance.setNo("130430xxxxxxxxxxxx");
}else {
System.out.println("重复办理身份证,获取旧号码!");
}
return instance;
}
public String getNo() {
return no;
}
public void setNo(String no) {
this.no = no;
}
}
客户端测试类
package com.zck.singledemo;
public class Client {
public static void main(String[] args) {
IdentifyCardNo n1,n2;
n1 = IdentifyCardNo.getInstance();
n2 = IdentifyCardNo.getInstance();
String str1,str2;
str1 = n1.getNo();
str2 = n2.getNo();
System.out.println("内容是否相同 ?"+ str1.equalsIgnoreCase(str2));
System.out.println("对象是否相同?" + (str1 == str2));
}
}
测试结果


浙公网安备 33010602011771号