单例设计模式

  • 概念:

单例模式的意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。

优点:减少内存开支、减少系统性能开销、避免对资源的多重占用、全局的访问点,优化和共享资源访问。

缺点:

  1. 单例模式一有接口,扩展困难,若要扩展,除了修改代码基本上没有第二种途径
  2. 单例模式对测试是不利的。
  3. 单例模式与单一职责原则有冲突
  • 应用场景:

    1. WEB站点的配置类(一般来讲全站只会有一个配置文件,或者只实例化一次configuration类)
    2. windows的Recycle Bin(回收站)
    3. Windows的Task Manager(任务管理器)
  • 实现方式:

饿汉实现方式(在类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快)

关键点:(代码注释已写)

1)私有构造函数

2)静态私有成员--在类加载时已初始化

3)公开访问点getInstance-----不需要同步,因为在类加载时已经初始化完毕,也不需要判断null,直接返回

懒汉实现方式(类加载时不初始化)

2种实现方式比较:

  1. 饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变。懒汉式如果在创建实例对象时不加上synchronized则会导致对对象的访问不是线程安全的。
  2. 从实现方式来讲他们最大的区别就是懒汉式是延时加载,他是在需要的时候才创建对象,而饿汉式在虚拟机启动的时候就会创建,饿汉式无需关注多线程问题,写法简单明了,能用则用。真正用到的时候才去建这个单例对象,“饿汉式”是在不管用不用得上,一开始就建立这个单例对象。
  • 单例模式的扩展:

如果要求实现一个类只能产生两三个对象,应该怎么办?(具体方法见设计模式之禅)

  • 最佳实践:

  • 要考虑对象的复制情况(克隆):c#中对象默认是不可以复制的,如果实现了克隆接口,则可以直接通过对象创建一个新对象,对象实现复制是不用调用类的构造函数,因此即使是私有的构造函数,对象任然可以被复制。所以最好的方法是就单例不要实现克隆接口。
  • 注意垃圾回收机制:如果我们的单例在内存长久不用,可能会被运行时进行垃圾回收。这时对象的状态可能会出现问题,应用也会出现问题,有2种办法可以解决
    • 由容器管理单例的生命周期
    • 状态随时记录:使用数据库或者将状态写入文件。
原文地址:https://www.cnblogs.com/gougou1981/p/12245707.html