设计模式 - 单件模式(singleton pattern) 详解
2014-06-05 10:32
363 查看
单件模式(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 stub
eSingleton 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;
}
@Override
public String toString() {
return "[" + name + "]";
}
}
输出:[Caroline]
[Caroline]
true
相关文章推荐
- 设计模式 - 单件模式(singleton pattern) 详解
- .NET中的设计模式二:单件模式 选择自 lane_cn 的 Blog
- 设计模式之单件(Singleton)的应用
- .NET中的设计模式二:单件模式
- .NET设计模式(2):单件模式(Singleton Pattern)
- .NET设计模式-单件模式(Singleton Pattern)
- [整理]C#面向对象设计模式纵横谈(2):Singleton单件(创建型模式)
- 设计模式23式详解
- 也谈单件模式类的设计(C++)
- 我的设计模式之旅(2)――单件模式Singleton
- 工作流模式详解之基本流程控制模式的应用与设计(1、2、3、4、5)
- 学习Singleton(单件)设计模式(一)
- 探索设计模式(2):单件模式(Singleton Pattern)
- 设计模式详解(拷贝)
- 设计模式入门(1)------单件(Singleton)
- .NET中的设计模式二:单件模式
- C#面向对象设计模式纵横谈(2):Singleton 单件(创建型模式) 笔记
- 设计模式之单件模式(Singleton)
- 设计模式原则详解
- 设计模式原则详解