• 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类中创建一个嵌套类,利用嵌套类来实现延迟初始化,这里就不再赘述。

  • 相关阅读:
    Qt之JSON生成与解析
    Qt的QLineEdit显示密码
    Ubuntu14.04 64位运行32位程序
    Xcode 7在支持ipad的设备中需要支持分屏!
    「模板」平衡树
    [NOI2016]区间 题解(决策单调性+线段树优化)
    [NOIP模拟测试12]题解
    [笔记乱写]0/1分数规划
    [NOIP模拟测试11] 题解
    [SCOI2014]方伯伯的玉米田 题解(树状数组优化dp)
  • 原文地址:https://www.cnblogs.com/saville/p/2313928.html
Copyright © 2020-2023  润新知