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

  • 相关阅读:
    ServletConfig对象
    Servlet生命周期
    BeanListHandler
    表单校验
    SQL30081N 检测到通信错误。正在使用的通信协议:"TCP/IP"
    交货单寄售发货接口
    PI 7.4/7.5 Alert 配置
    SAP PI soap 方式 头部 传输 wsse:Security wsse:UsernameToken
    smartforms 打印参数 ( 预览 和 不预览直接打印 )设置
    migo增强中获取屏幕值的方法
  • 原文地址:https://www.cnblogs.com/amylis_chen/p/6007882.html
Copyright © 2011-2022 走看看