一、概念
单例模式是创建型模式。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法,单例模式的要点有三个:
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;
}
}

public class Singleton {
//最简单的写法,缺点在于实例在类初始化的时候就创建了,
//如果在整个项目中都没有使用到该类,就会创建内存空间的浪费。
private static Singleton instance=new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return instance;
}
}
四、应用
身份证号码唯一,身份证卡重办也是唯一的身份证,此问题应用可以使用单例模式。
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
