zoukankan      html  css  js  c++  java
  • C#设计模式——单件模式(Singleton Pattern)

    一、概述
    在软件开发过程中,我们有时候需要保证一个类仅有一个实例,比如在一个电脑用户下只能运行一个outlook实例。这时就需要用到单件模式。
    二、单件模式
    单件模式保证一个类仅有一个实例,并提供一个访问它的全局访问点。。
    单件模式的结构图如下:

    Singleton负责创建自己的唯一实例,并定义一个Instance方法允许客户访问该实例。
    三、示例
    先来看看最简单的单件模式实现例子。

     1     class SimpleSingleton
    2 {
    3 private static SimpleSingleton _instance;
    4
    5 private SimpleSingleton()
    6 {
    7 }
    8
    9 public static SimpleSingleton Instance()
    10 {
    11 if (_instance == null)
    12 {
    13 _instance = new SimpleSingleton();
    14 }
    15 return _instance;
    16 }
    17 }

    显然,这种实现方式并不是线程安全的,在多线程环境中可能会得到多个SimpleSingleton实例。要解决这一问题,可以使用双重否定的方式。首先创建一个Singleton类的私有静态变量 padlock。

    private static readonly object _padlock = new object();

    然后修改Instance方法。

     1     if (instance==null)
    2 {
    3 lock (_padlock)
    4 {
    5 if (instance==null)
    6 {
    7 instance = new Singleton();
    8 }
    9 }
    10 }
    11 return instance;

    在实际应用中,一般可以利用C#静态初始化的特性来实现线程安全的Singleton。

     1     class ThreadSafeSingleton
    2 {
    3 private static ThreadSafeSingleton _instance = new ThreadSafeSingleton();
    4
    5 private ThreadSafeSingleton()
    6 {
    7 }
    8
    9 public static ThreadSafeSingleton Instance()
    10 {
    11 return _instance;
    12 }
    13 }

    这种方法比较简单,但也有一个缺点,即无法实现延迟初始化。对此可以在Singleton类中创建一个嵌套类,利用嵌套类来实现延迟初始化,这里就不再赘述。

  • 相关阅读:
    4. 归并排序
    3. 堆排序
    2. 希尔排序
    1. 选择排序、插入排序、冒泡排序
    1. 拓扑排序
    8. 最大堆
    7. B+树
    6. B树
    5. 二叉查找树、平衡二叉树、红黑树的效率比较
    4. 红黑二叉树
  • 原文地址:https://www.cnblogs.com/saville/p/2313928.html
Copyright © 2011-2022 走看看