写在前面
本文看下单例设计模式。
写在前面
本文一起看一种创建型设计模式,单例设计模式。
1:介绍
1.1:什么时候单例设计模式
当程序只需要一个对象时使用。
1.2:UML类图
原型设计模式,包含如下元素:
1:单例类提供一个方法获取自身唯一的实例对象。
2:实例
源码 。
2.1:场景
2.2:程序
- 饿汉式
//饿汉式单例
public class Hungry {//构造器私有,别人就无法去new这个对象,保证内存中只有一个对象private Hungry(){}private final static Hungry HUNGRY = new Hungry();public static Hungry getInstance(){return HUNGRY;}
}
可以通过反射创建新实例,非绝对安全。
- 懒汉式
(非线程安全)
//懒汉式单例
public class LazyMan {private LazyMan() {System.out.println(Thread.currentThread().getName() + " ok!");}private static LazyMan lazyMan;public static LazyMan getInstance() {if (lazyMan == null) {lazyMan = new LazyMan();}return lazyMan;}
}
可以通过反射创建新实例,非绝对安全。
- DCL懒汉式
(线程安全)
public class DclLazy {private static DclLazy instance;private static final Object mutexLock = new Object();// 私有化构造函数,防止外部创建private DclLazy() {}public static DclLazy getInstance() {// 第一次检查实例是否创建if (instance == null) {// 获取锁synchronized (mutexLock) {// 第二次检查实例是否创建if (instance == null) {System.out.println("实例初始化开始了");// 创建实例instance = new DclLazy();System.out.println("实例初始化结束了");}}}return instance;}
}
可以通过反射创建新实例,非绝对安全。
- 枚举
public enum EnumCls {zhangsan("张三女");private String name;EnumCls(String name) {this.name = name;}
}
无法通过反射创建新实例,相对安全。
写在后面
参考文章列表
单例模式(饿汉式,DCL懒汉式) 。