单例模式

模式定义

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

模式结构图

 

 

 模式分析

单例模式:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,只包含一个角色,就是单例类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));
	}
}

  

测试结果

 

posted @ 2020-11-02 18:45  一笑任逍遥  阅读(105)  评论(0编辑  收藏  举报