单例模式又叫做单态模式或者单件模式。在 GOF 书中给出的定义为:保证一个类仅有一个实例,并提供一个访问它的全局访问点。单例模式中的“单例”通常用来代表那些本质上具有唯一性的系统组件(或者叫做资源)。比如文件系统、资源管理器等等。
一、懒汉式
package singlepattern;
public class LazySingle {
private static LazySingle lazysingle;
private LazySingle(){}
public static LazySingle getinstance(){
if (lazysingle==null)
lazysingle = new LazySingle();
return lazysingle;
}
}
这种方式不支持多线程
package singlepattern;
public class LazySynchronizedSingle {
private static LazySynchronizedSingle lazySynchronizesingle;
public LazySynchronizedSingle(){System.out.println("lazySynchronizesingle!");}
public synchronized static LazySynchronizedSingle getinstance(){
if (lazySynchronizesingle==null)
lazySynchronizesingle = new LazySynchronizedSingle();
return lazySynchronizesingle;
}
public static void main(String[] args){
getinstance();
}
}
注意获取该实例的方法应该是static的
二、饿汉式
package singlepattern;
public class Singleton {
private static Singleton singleton = new Singleton();
private Singleton(){}
public static Singleton getinstance(){
return singleton;
}
}
这种方法比较常用,而且是线程安全的。
三、测试实例
首先修改Singleton.java的代码
package singlepattern;
public class Singleton {
private String name=null;
private static Singleton singleton = new Singleton();
private Singleton(){}
private void setname(String name){
this.name = name;
}
public static Singleton getinstance(String name){
singleton.setname(name);
return singleton;
}
public String getName() {
return name;
}
}
然后是测试代码
package singlepattern;
public class test {
public static void main(String[] args){
Singleton s1 = Singleton.getinstance("duan");
System.out.println(s1.getName());
Singleton s2 = Singleton.getinstance("cool");
System.out.println(s1.getName());
System.out.println(s1.equals(s2));
}
}
//测试结果:
duan
cool
true
发现s1与s2打印出来的名字不同(实际上后来修改了名字),然而是一个实例。