索引

意图

保证一个类仅有一个实例,并提供一个访问它的全局访问点。

Ensure a class only has one instance, and provide a global point of access to it.

结构

参与者

Singleton

  • 定义一个 Instance 操作,允许客户访问它的唯一实例。Instance 是一个类操作。
  • 可能负责创建它自己的唯一实例。

适用性

在以下情况下可以使用 Singleton 模式:

  • 当类只能有一个实例并且客户可以从一个众所周知的访问点访问它时。
  • 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。

缺点

  • 系统检查开销。实现中可能每次都需要检查实例是否存在,这个问题可以通过 Static 实例来解决。
  • 系统资源开销。通常 Singleton 中的对象一旦被创建,不会被及时销毁。可以通过提供 Reset 操作来重置。
  • 引起开发混淆。如果类包括 public 构造函数可以在外部构造,当使用 Singleton 对象时,开发人员需要记住不能使用 new 关键字来实例化对象。
  • 不易于测试。通常使用 Singleton 时需要考虑是否是反模式,设计是否存在问题。引入 Singleton 或静态实例会为 Unit Testing 带来困难。

效果

  • 对唯一实例的受控访问。
  • 缩小名空间。避免存储唯一实例的全局变量污染名空间
  • 允许对操作和表示的精化。Singleton 类可以有子类,通过扩展类在运行时刻配置应用。
  • 允许可变数目的实例。控制应用所使用的实例的数目。
  • 比类操作更灵活。比如使用静态成员函数。

相关模式

  • 很多模式可以使用 Singleton 模式实现。例如:Abstract Factory可以设计为 Singleton 实例。

实现

实现方式(一):使用 Static 变量初始化 Singleton。

在类加载时即创建实例。缺点是无论使用与否实例均被创建。

 namespace SingletonPattern.Implementation1
{
public class Singleton
{
private static Singleton _instance = new Singleton(); // the constructor should be protected or private
protected Singleton()
{
} public static Singleton Instance()
{
return _instance;
}
}
}

实现方式(二):使用 Lazy Initialization 来实现 Singleton

通常将创建类的唯一实例的操作隐藏在一个类操作后面,由它保证只有一个实例被创建。这个操作可以访问保存唯一实例的变量,保证在它的首次使用前被创建和初始化。

 namespace SingletonPattern.Implementation2
{
public class Singleton
{
private static Singleton _instance; // the constructor should be protected or private
protected Singleton()
{
} public static Singleton Instance()
{
if (_instance == null)
{
// use lazy initialization
_instance = new Singleton();
} return _instance;
}
}
}

实现方式(三):使用 Reset 来重置 Singleton

可以使用 Reset 操作来将已创建的实例销毁掉。

 namespace SingletonPattern.Implementation3
{
public class Singleton
{
private static Singleton _instance; // the constructor should be protected or private
protected Singleton()
{
} public static Singleton Instance()
{
if (_instance == null)
{
// use lazy initialization
_instance = new Singleton();
} return _instance;
} public void Reset()
{
_instance = null;
}
}
}

实现方式(四):使用 Double-Check Locking 技术实现 Singleton

Singleton 的实现如果需要保证线程安全性,则可以使用 Double-Check Locking 技术。

 namespace SingletonPattern.Implementation4
{
public class Singleton
{
private static Singleton _instance;
private static readonly object _syncRoot = new object(); // the constructor should be protected or private
protected Singleton()
{
} public static Singleton Instance()
{
// double-check locking
if (_instance == null)
{
lock (_syncRoot)
{
if (_instance == null)
{
// use lazy initialization
_instance = new Singleton();
}
}
} return _instance;
}
}
}

实现方式(五):使用注册表机制创建和查询 Singleton 类的子类实例

如果系统中定义了多个 Singleton 的子类,可以实现一个注册表机制,用于存储子类的映射。

 namespace SingletonPattern.Implementation5
{
public class Singleton
{
private static Dictionary<string, Singleton> _registry
= new Dictionary<string, Singleton>();
private static Singleton _instance; // the constructor should be protected or private
protected Singleton()
{
} public static Singleton Instance(string name)
{
if (!_registry.ContainsKey(name))
{
if (name == "Apple")
{
_registry.Add(name, new AppleSingleton());
}
else if (name == "Orange")
{
_registry.Add(name, new OrangeSingleton());
}
} return _registry[name];
}
} public class AppleSingleton : Singleton
{
} public class OrangeSingleton : Singleton
{
}
}

设计模式之美》为 Dennis Gao 发布于博客园的系列文章,任何未经作者本人同意的人为或爬虫转载均为耍流氓。

设计模式之美:Singleton(单件)的更多相关文章

  1. C#面向对象设计模式纵横谈——2.Singleton 单件(创建型模式)

    一:模式分类 从目的来看: 创建型(Creational)模式:负责对象创建. 结构型(Structural)模式:处理类与对象间的组合. 行为型(Behavioral)模式:类与对象交互中的职责分配 ...

  2. 设计模式之美:Creational Patterns(创建型模式)

    创建型模式(Creational Patterns)抽象了对象实例化过程. 它们帮助一个系统独立于如何创建.组合和表示它的那些对象. 一个类创建型模式使用继承改变被实例化的类. 一个对象创建型模式将实 ...

  3. 设计模式之美:Null Object(空对象)

    索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):Null Object 的示例实现. 意图 通过对缺失对象的封装,以提供默认无任何行为的对象替代品. Encapsulate t ...

  4. 设计模式之美:Object Pool(对象池)

    索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):实现 DatabaseConnectionPool 类. 实现方式(二):使用对象构造方法和预分配方式实现 ObjectPool ...

  5. 设计模式之美:State(状态)

    索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):由 ConcreteState 指定它的后继 State. 意图 允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改 ...

  6. 设计模式之美:Facade(外观)

    索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):用抽象类定义 Facade 而使子类对应于不同的子系统. 意图 为子系统中的一组接口提供一个一致的界面,Facade 模式定义了 ...

  7. 设计模式之美:Abstract Factory(抽象工厂)

    索引 别名 意图 结构 参与者 适用性 缺点 效果 相关模式 命名约定 实现 实现方式(一):使用 Factory Method 来实现 Abstract Factory. 实现方式(二):使用 Pr ...

  8. 《设计模式之美》 <03>面向对象、设计原则、设计模式、编程规范、重构,这五者有何关系?

    面向对象 现在,主流的编程范式或者是编程风格有三种,它们分别是面向过程.面向对象和函数式编程.面向对象这种编程风格又是这其中最主流的.现在比较流行的编程语言大部分都是面向对象编程语言.大部分项目也都是 ...

  9. 设计模式之单例模式——Singleton

                        设计模式之单例模式--Singleton 设计意图: 保证类仅有一个实例,并且可以供应用程序全局使用.为了保证这一点,就需要这个类自己创建自己的对象,并且对外有 ...

随机推荐

  1. Excel_常用快捷键

    Ctrl+B        粗体Ctrl+U         下划线Ctrl+I         斜体Ctrl+5      删除线Ctrl+9      隐藏选中的行Ctrl+0      隐藏选中 ...

  2. ipad或iPhone 访问https网站不成功

    可能的原因是设备的日期不对,将设备日期调整正确即可解决

  3. Hibernate框架概念

    1.Hibernate是ORM框架,完成对象的持久化操作. 2.允许开发者采用面向对象的方式来操作数据库. 3.安装Hibernate的插件到Eclipse中来自动生成配置文件. 4.Hibernat ...

  4. JS根据服务器时间倒计时

    原文链接:http://caibaojian.com/daojishi-2.html //获取服务器时间 function getSevertime(){ var xmlHttp = new XMLH ...

  5. Gradle basic

    1. execute default file (build.gradle) gradlew 2. execute another file gradlew -b [filename] 3.  bas ...

  6. 【Tyvj1601】魔兽争霸(主席树,树套树)

    题意:要求在N个数的序列中支持以下操作: 1:将第X个元素加上Y 2:询问当前K大值 n<=30000,m<=50000 思路:树状数组套主席树 Tyvj又炸了,还不知道对不对 ..12] ...

  7. javascript动态添加本地文件列表信息

    工作需要做了一个动态添加列表页面的小demo.用到了杂七杂八的javascript小知识. 而且并没有涉及到工作中的具体情境.有些通用,所以暂且罗列到这里.以后需要的时候可以直接拿来用. 看源码总是让 ...

  8. UVA 11624 Fire!(广度优先搜索)

    题目大意:在一个N*M的迷宫内,J代表某人(只有一个),F代表火(可能不只一个),#代表墙,火每分钟会向四周除了墙以外的地方扩散一层,问人能否在没被火烧到 之前逃出迷宫,若能逃出输出最短时间.很明显的 ...

  9. MVC 路由模块内核原理

    .net网站第一次运行的时候 执行global文件的application_start方法 注册路由信息   RouteConfig.RegisterRoutes(RouteTable.Routes) ...

  10. 团队项目作业:利用NABCD模型进行竞争性需求分析

    NABC正是这样的一套框架,当你试图提出一项崭新的提案之际,它能够提供四个思维基点,令你的商业策划具备天马行空的基础. 具体来说,NABC是四个关键词的首字母缩写- Need(需求)-现在市场上未被满 ...