您的位置:首页 > 编程语言 > Go语言

GOF二十三种设计模式之单例模式

2017-05-10 00:00 211 查看
在GOF二十三种设计模式中,又进一步分为创建型模式、结构型模式、行为型模式三种,每一种下又分为不同的模式,分类列举如下:

创建型模式:单例模式、工厂模式、抽象工厂模式、建造者模式、原型模式。

结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。

行为型模式:模板方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式、访问者模式。

单例模式:顾名思义,就是一个实例,保证一个类只有一个具体化的实例,去完成一定的工作,提供一个可供访问该实例的全局访问点,例如Windows操作系统下的回收站就是一个典型的单例。下边介绍单例模式的几种实现方式:

1.饿汉式实现:

public class SingletonDemo02 {
//类初始化时,立即加载这个对象(没有延时加载的优势).加载类是天然的线程安全
private static SingletonDemo02 instance = new SingletonDemo02();

private SingletonDemo02(){//私有化构造器

}

//方法没有同步,调用效率高
public static SingletonDemo02 getInstance(){
return instance;
}
2.懒汉式实现:

public class SingletonDemo01 {
//类初始化时,不初始化这个对象(延时加载,真正用的时候再创建)
private static SingletonDemo01 instance;

private SingletonDemo01(){//私有化构造器

}

//方法同步,调用效率低
public static synchronized SingletonDemo01 getInstance(){
if(instance==null){
instance = new SingletonDemo01();
}
return instance;
}
}

3.双重检测锁式实现:

public class SingletonDemo03 {

private static SingletonDemo03 instance = null;

public static SingletonDemo03 getInstance(){
if(instance==null){
SingletonDemo03 sc;
synchronized (SingletonDemo03.class) {
sc = instance;
if(sc == null){
synchronized (SingletonDemo03.class) {
if(sc==null){
sc = new SingletonDemo03();
}
}
instance = sc;
}
}
}
return instance;
}
private SingletonDemo03(){
}
}

4.静态内部类实现:

public class SingletonDemo04 {
private static class SingletonClassInstance{
private static final SingletonDemo04 instance = new SingletonDemo04();
}

private SingletonDemo04(){

}

//方法没有同步,调用效率高
public static SingletonDemo04 getInstance(){
return SingletonClassInstance.instance;
}
}

5.枚举式实现:

public enum SingletonDemo05 {

//这个枚举元素,本身就是单例对象
INSTANCE;

//添加自己需要的操作
public void SingletonOperation(){

}
}

分析:在饿汉式实现时,假若此类一直不曾被调用,资源就会遭到浪费,在懒汉式实现时,解决了这个问题,但是每次都要加上线程锁,确保当某线程获取到此资源时,不被其他线程抢占,造成不可预知的错误,这样,很显然会造成执行效率的下降。双重检测锁实现,不太了解,貌似由于编译器优化和JVM底层模型的原型的原因,偶尔出错,不建议使用。而在静态内部类实现中,兼备了效率和延迟加载的优势,推荐这种,最后的枚举,就是一个天然的单例模式,由JVM来进行保证,但是它不具备延迟加载的优势。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息