设计模式-单例模式

一、概念

单例模式是创建型模式。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法,单例模式的要点有三个:
1.类只有一个实例
2.必须自行创建这个实例
3.自行向整个系统提供这个实例

二、角色

只有一个单例角色,在单例类内部实现并且只生成一个实例,同时提供一个静态方法的getInstance()工厂方法获取实例;为了防止在外部对其实例化,将其构造函数设计为私有,这样就不可以在外面直接new了

三、模板代码

public class Singleton {
    private static Singleton instance=null;//不会立刻创建对象,省得没用到浪费
    private Singleton() {
    }
    //静态公有方法
    public static Singleton getInstance() {
        if(instance==null)//不能用于多线程,如果都通过if进入,就可能出现创建多个实例的问题
            instance=new Singleton();
        return instance;
    }
}
View Code
public class Singleton {
    //最简单的写法,缺点在于实例在类初始化的时候就创建了,
    //如果在整个项目中都没有使用到该类,就会创建内存空间的浪费。
    private static Singleton instance=new Singleton();
    private Singleton() {
    }
    public static Singleton getInstance() {
        return instance;
    }
}
View Code

四、应用

身份证号码唯一,身份证卡重办也是唯一的身份证,此问题应用可以使用单例模式。

public class IdCard {

    private static IdCard instane=null;
    private String no;//号码
    private IdCard() {
    }
    public static IdCard getInstance() {
        if(instane==null)
        {
            System.out.println("首次办理身份证,分配新号码");
            instane=new IdCard();
            instane.setNo("100865201314");
        }
        else 
            System.out.println("重复办理身份证,获取旧号码");
        return instane;
    }
    
    private void setNo(String no) {
        this.no=no;
    }
    public String getNo() {
        return this.no;
    }
}
public class Client {
    public static void main(String[] args) {
        IdCard x1,x2;
        x1=IdCard.getInstance();
        x2=IdCard.getInstance();
        //IdCard x3=new IdCard();//报错,不可以在外部构造
        System.out.println("对象是否相同 x1==x2  "+(x1==x2));//x1和x2也是同一个类
        String s1,s2;
        s1=x1.getNo();
        s2=x2.getNo();
        String s3=new String("100865201314");
        System.out.println("内容是否相同 s1==s2  "+s1.equalsIgnoreCase(s2));
        System.out.println("内容是否相同 s1==s3  "+s1.equalsIgnoreCase(s3));
        System.out.println("对象是否相同 s1==s2  "+(s1==s2));//true 显然s1和s2指向的是同一片堆内存
        System.out.println("对象是否相同 s1==s3  "+(s1==s3));//false 
    }
}

输出:

首次办理身份证,分配新号码
重复办理身份证,获取旧号码
对象是否相同 x1==x2 true
内容是否相同 s1==s2 true
内容是否相同 s1==s3 true
对象是否相同 s1==s2 true
对象是否相同 s1==s3 false

原文地址:https://www.cnblogs.com/shoulinniao/p/11750042.html