模式定义
单例模式:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为实例类,它提供全局访问的方法,是一种对象创建型模式。
模式结构图
模式分析
单例模式:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,只包含一个角色,就是单例类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)); } }
测试结果