设计模式 - 单件模式(singleton pattern) 详解

来源:互联网 发布:淘宝发票在哪里 编辑:程序博客网 时间:2024/05/29 18:15

单件模式(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;}}

4. 枚举单件(enum singleton)模式, 也可以保证线程安全.

代码:

/** * @time 2014.6.5 */package singleton;/** * @author C.L.Wang * */public class EnumSingleton {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubeSingleton d1 = eSingleton.INSTANCE;d1.setName("Spike");eSingleton d2 = eSingleton.INSTANCE;d2.setName("Caroline");System.out.println(d1);System.out.println(d2);System.out.println(d1 == d2);}}enum eSingleton {INSTANCE;private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "[" + name + "]";}}

输出:

[Caroline][Caroline]true










11 0
原创粉丝点击