Java设计模式-单例模式(Singleton)

来源:互联网 发布:mac outlook 离线文件 编辑:程序博客网 时间:2024/04/30 02:59

目的:

确保一个类只能实例化一个对象,并提供一个全局访问点。

什么时候用:

  • 一个类只实例化一个对象时。

典型使用:

  • 日志类
  • 管理数据库连接
  • IO,文件操作

实际的例子:

  • java.lang.Runtime#getRuntime()

示例代码:

  • 线程安全(在定义变量instance时初始化)

public class EagerlySingleton {     //单例类private static EagerlySingleton instance = new EagerlySingleton();private EagerlySingleton() {}public static EagerlySingleton getInstance() {return instance;}}
public class App{              //测试public static void main(String[] args) {EagerlySingleton eSingleton1 = EagerlySingleton.getInstance();EagerlySingleton eSingleton2 = EagerlySingleton.getInstance();System.out.println("eSingleton1=" + eSingleton1);System.out.println("eSingleton2=" + eSingleton2);}}
输出:
eSingleton1=EagerlySingleton@487f6155eSingleton2=EagerlySingleton@487f6155

  • 线程安全

public class LazySingleton {private static LazySingleton instance = null;private LazySingleton() {}public synchronized static LazySingleton getInstance() {      //synchronizedif (instance == null) {instance = new LazySingleton();}return instance;}}

  • Enum

public enum EnumSingleton {    INSTANCE;    @Override    public String toString() {        return getDeclaringClass().getCanonicalName() + "@" + hashCode();    }}
<pre name="code" class="java">public class App {public static void main(String[] args) {EnumSingleton enumSingleton1 = EnumSingleton.INSTANCE;EnumSingleton enumSingleton2 = EnumSingleton.INSTANCE;System.out.println("enumSingleton1=" + enumSingleton1); // enumSingleton1=EnumSingleton@298792720System.out.println("enumSingleton2=" + enumSingleton2); // enumSingleton2=EnumSingleton@298792720<span style="white-space:pre"></span>}}

  • Serializable
import java.io.Serializable;public class InitializingOnDemandHolderIdiom implements Serializable{private static final long serialVersionUID = 1L;private static class HelperHolder {public static final InitializingOnDemandHolderIdiom INSTANCE = new InitializingOnDemandHolderIdiom();}public static InitializingOnDemandHolderIdiom getInstance() {return HelperHolder.INSTANCE;}private InitializingOnDemandHolderIdiom() {}protected Object readResolve() {return getInstance();}}
public class App {public static void main(String[] args) {InitializingOnDemandHolderIdiom demandHolderIdiom = InitializingOnDemandHolderIdiom.getInstance();System.out.println(demandHolderIdiom);<span style="white-space:pre"></span>  //InitializingOnDemandHolderIdiom@528f2588InitializingOnDemandHolderIdiom demandHolderIdiom2 = InitializingOnDemandHolderIdiom.getInstance();System.out.println(demandHolderIdiom2);  //InitializingOnDemandHolderIdiom@528f2588<span style="white-space:pre"></span>}}

  • Double check locking
public class DoubleCheckLocking {private static volatile DoubleCheckLocking INSTANCE;private DoubleCheckLocking() {//反射if(INSTANCE != null)throw new IllegalStateException("initialized.");}public static DoubleCheckLocking getInstance() { DoubleCheckLocking result = INSTANCE;if (result == null) {synchronized (DoubleCheckLocking.class) {result = INSTANCE;if (result == null) {INSTANCE = result = new DoubleCheckLocking();}}}return result;}}
public class App {public static void main(String[] args) {DoubleCheckLocking dcl1 = DoubleCheckLocking.getInstance();System.out.println(dcl1);   //DoubleCheckLocking@487f6155DoubleCheckLocking dcl2 = DoubleCheckLocking.getInstance();System.out.println(dcl2);   //DoubleCheckLocking@487f6155}}

@斗大的熊猫









0 0
原创粉丝点击