单例模式又叫做单态模式或者单件模式。在 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打印出来的名字不同(实际上后来修改了名字),然而是一个实例。