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

  • 相关阅读:
    前缀和-长度最小的子数组
    找到字符串中所有的字母异位词
    区间列表的交集
    比较含退格的字符串
    [转] ios数组基本用法和排序
    [转] 【iOS基础知识】之判断NSString是否为整数、浮点数
    解决resignFirstResponder或者endEditing无效的办法
    iOS 根据文字字数动态确定Label宽高
    [转] iOS开发-搜索栏UISearchBar和UISearchController
    UIActionSheet的最后一项点击失效
  • 原文地址:https://www.cnblogs.com/amylis_chen/p/6007882.html
Copyright © 2011-2022 走看看