单例模式

单例模式(Singleton)
常见应用:
1. 配置文件
2. 日历类
3. IOC容器
4. Windows任务管理器

1.饿汉式单例

Class EagerSingleton {   
    private static final EagerSingleton instance = new EagerSingleton();   
    private EagerSingleton() { }   
    public static EagerSingleton getInstance() {  
        return instance;   
    }     
}

优点:
线程安全、在类加载的同时已经创建好一个静态对象,调用时反应速度快

缺点:
资源效率不高,可能getInstance()永远不会执行到,但执行该类的其他静态方法或者加载了该类(class.forName),那么这个实例仍然初始化

2.懒汉式单例

Class LazySingleton {   
    private volatile static LazySingleton instance = null;

    private LazySingleton() { }   

    public static LazySingleton getInstance() {   
        //第一重判断  
        if (instance == null) {  
            //锁定代码块  
            synchronized (LazySingleton.class) {  
                //第二重判断  
                if (instance == null) {  
                    instance = new LazySingleton(); //创建单例实例  
                }  
            }  
        }  
        return instance;   
    } 
}

优点:
资源利用率高,不执行getInstance()就不被实例,可以执行该类其他静态方法

缺点 :
第一次加载时反应不快,由于java内存模型一些原因偶尔失败

3.内部静态类实现

Class Singleton {  
    private Singleton() {  
    }  

    private static class SingletonHolder {  
        private final static Singleton instance = new Singleton();  
    }  

    public static Singleton getInstance() {  
        return SingletonHolder.instance;  
    }    
}  

优点:
资源利用率高,不执行getInstance()不被实例,可以执行该类其他静态方法

缺点 :
第一次加载时反应不够快

4.枚举实现

public enum EnumSingleton {
  INSTANCE;
}

优点:
代码简洁,线程安全,防反射攻击、防止序列化生成新的实例

总结:
一.主要优点:

  1. 单例模式提供了对唯一实例的受控访问。因为单例类封装了它的唯一实例,所以它可以严格控制客户怎样以及何时访问它。
  2. 由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能。
  3. 允许可变数目的实例。基于单例模式我们可以进行扩展,使用与单例控制相似的方法来获得指定个数的对象实例,既节省系统资源,又解决了单例单例对象共享过多有损性能的问题。

二.主要缺点:

  1. 由于单例模式中没有抽象层,因此单例类的扩展有很大的困难。
  2. 单例类的职责过重,在一定程度上违背了“单一职责原则”。因为单例类既充当了工厂角色,提供了工厂方法,同时又充当了产品角色,包含一些业务方法,将产品的创建和产品的本身的功能融合到一起。
  3. 现在很多面向对象语言(如Java、C#)的运行环境都提供了自动垃圾回收的技术,因此,如果实例化的共享对象长时间不被利用,系统会认为它是垃圾,会自动销毁并回收资源,下次利用时又将重新实例化,这将导致共享的单例对象状态的丢失。

三.适用场景:.

  1. 系统只需要一个实例对象,如系统要求提供一个唯一的序列号生成器或资源管理器,或者需要考虑资源消耗太大而只允许创建一个对象。
  2. 客户调用类的单个实例只允许使用一个公共访问点,除了该公共访问点,不能通过其他途径访问该实例。

参考文章:https://blog.csdn.net/lovelion/article/details/17517213/

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_25885525/article/details/79948630
个人分类: 设计模式
下一篇程序员技能树
想对作者说点什么? 我来说一句

单例模式单例模式单例模式

2011年07月31日 467KB 下载

研磨单例模式研磨单例模式

2010年12月15日 123KB 下载

单例模式(讲解单例模式)

2011年01月18日 317KB 下载

php单例模式和工厂模式

2009年05月22日 54KB 下载

Java单例模式(DOC)

2009年10月21日 91KB 下载

JAVA单例模式

2013年11月14日 46KB 下载

设计模式之单例模式

2017年12月01日 9KB 下载

线程安全的单例模式

2012年12月07日 345KB 下载

单例模式详解~~单例模式详解~~

2011年03月01日 39KB 下载

研磨设计模式之单例模式.pdf

2011年11月16日 311KB 下载

没有更多推荐了,返回首页

关闭
关闭