• 单例模式


    模式定义

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

    模式结构图

     模式分析

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

      

    测试结果

  • 相关阅读:
    javascript生成二维码
    Gulp--Less
    自动构建工具Gulp
    上传文件返回数据提示下载
    svg
    Grunt--Less
    node.js--Less
    浏览器端Less
    HTML5表单
    node.js模块依赖及版本号
  • 原文地址:https://www.cnblogs.com/2016-zck/p/13915736.html
Copyright © 2020-2023  润新知