首页 > 代码库 > 设计模式 - 单件模式(singleton pattern) 详解
设计模式 - 单件模式(singleton pattern) 详解
单件模式(singleton pattern) 详解
本文地址: http://blog.csdn.net/caroline_wendy/article/details/28595349
单件模式(singleton pattern) : 确保一个类只有一个实例, 并提供一个全局访问点.
单价模式包括3个部分: 私有构造器, 静态变量, 静态方法.
具体方法:
1. 标准的单例模式:
/** * @time 2014.6.5 */ package singleton; /** * @author C.L.Wang * */ public class Singleton { private static Singleton uniqueInstance; //静态变量 private Singleton() {} //私有构造函数 public static Singleton getInstance() { //静态方法 if (uniqueInstance == null) uniqueInstance = new Singleton(); return uniqueInstance; } }
2. 考虑多线程的三种方法:
同步(synchronized)方法, 添加"synchronized", 会导致性能下降, 每次调用示例, 都需要同步, 但是使用简单.
/** * @time 2014.6.5 */ package singleton; /** * @author C.L.Wang * */ public class Singleton { private static Singleton uniqueInstance; //静态变量 private Singleton() {} //私有构造函数 public static synchronized Singleton getInstance() { //静态方法 if (uniqueInstance == null) uniqueInstance = new Singleton(); return uniqueInstance; } }
急切(eagerly)方法, 开始时创建实例, 会在不需要时, 占用实例空间, 即占用空间时间过长.
/** * @time 2014.6.5 */ package singleton; /** * @author C.L.Wang * */ public class Singleton { private static Singleton uniqueInstance = new Singleton(); //静态变量 private Singleton() {} //私有构造函数 public static synchronized Singleton getInstance() { //静态方法 //if (uniqueInstance == null) //uniqueInstance = new Singleton(); return uniqueInstance; } }
双重检查加锁(double-checked locking)方法, 使用"volatile"和"synchronized (Singleton.class)", 减少时间消耗, 适用于java1.4以上版本.
/** * @time 2014.6.5 */ package singleton; /** * @author C.L.Wang * */ public class Singleton { private volatile static Singleton uniqueInstance; //静态变量 private Singleton() {} //私有构造函数 public static synchronized Singleton getInstance() { //静态方法 if (uniqueInstance == null) { synchronized (Singleton.class) { if (uniqueInstance == null) uniqueInstance = new Singleton(); } } return uniqueInstance; } }
3. 使用单件模式的例子:
代码:
/** * @time 2014.6.5 */ package singleton; /** * @author C.L.Wang * */ public class ChocolateBoiler { //巧克力锅炉 private boolean empty; private boolean boiled; public static ChocolateBoiler uniqueInstance; //静态变量 private ChocolateBoiler() { //私有构造函数 empty = true; boiled = false; } public static ChocolateBoiler getInstance() { //静态方法 if (uniqueInstance == null) uniqueInstance = new ChocolateBoiler(); return uniqueInstance; } public void fill() { //填满 if (isEmpty()) { empty = false; boiled = false; } } public void drain() { //倾倒 if (!isEmpty() && isBoiled()) empty = true; } public void boil() { //煮 if (!isEmpty() && !isBoiled()) { boiled = true; } } public boolean isEmpty() { return empty; } public boolean isBoiled() { return boiled; } }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。