zoukankan      html  css  js  c++  java
  • .net中的设计模式---单例模式

    .net设计模式:

    Net设计模式实例之单例模式( Singleton Pattern)

     一 : 单例模式的简介:(Brief Introduction)

    单例模式(Singleton Pattern),保证一个类只有一个实例,并提供一个访问它的全局访问点。单例模式因为Singleton封装它的唯一实例,它就可以严格地控制客户怎样访问它以及何时访问它。简单说就是单一模式:仅能有你一个人访问;

    二、解决的问题(What To Solve)

     当一个类只允许创建一个实例时,可以考虑使用单例模式。    

     三.单例模式分析(Analysis

    Singleton,定义一个私有变量instance;私有构造方法Singleton()和方法GetInstance();

    私有变量instance:

    单例模式结构:

    private static Singleton instance;

    私有构造方法Singleton(),外界不能使用new关键字来创建此类的实例了。

    private Singleton()

    {

    }

    方法GetInstance(), 此方法是本类实例的唯一全局访问点。

    public static Singleton GetInstance()

    {

        //如实例不存在,则New一个新实例,否则返回已有实例

        if (instance == null)

        {

            instance = new Singleton();

        }

        return instance;

    }

    单例模式代码

    1、单例模式类Singleton

    public class Singleton

    {

        private static Singleton instance;

     

        /// <summary>

        /// 程序运行时,创建一个静态只读的进程辅助对象

        /// </summary>

        private static readonly object _object = new object();

     

        /// <summary>

        /// 构造方法私有,外键不能通过New类实例化此类

        /// </summary>

        private Singleton()

        {

        }

        /// <summary>

        /// 此方法是本类实例的唯一全局访问点

        /// (双重加锁 Double-Check Locking)

        /// </summary>

        /// <returns></returns>

        public static Singleton GetInstance()

        {

            //先判断实例是否存在,不存在再加锁处理

            if (instance == null)

            {

                //在同一时刻加了锁的那部分程序只有一个线程可以进入,

                lock (_object)

                {

                    //如实例不存在,则New一个新实例,否则返回已有实例

                    if (instance == null)

                    {

                        instance = new Singleton();

                    }

                }

            }

            return instance;

        }

    }

     

    2、客户端代码

    static void Main(string[] args)

    {

        Singleton singleton2 = Singleton.GetInstance();

        Singleton singleton3 = Singleton.GetInstance();

        if (singleton2 ==singleton3)

        {

            Console.WriteLine("实例singleton2与实例singleton3相同!");

        }

        Console.ReadKey();

    }

    单例模式也可以不用枷锁,例如在一个类中使用三层技术调用类:

      #region  获取自身的单例模式:UserInfo 代表了Bll层中的类文件

            private static UserInfo instance;

            public static UserInfo GetInstance()

            {

                if (instance==null)

                {

                    instance = new UserInfo ();

                }

                return instance;

            }

            #endregion

    在表示层调用:

    .BLL . UserInfo   bll = BLL. UserInfo.GetInstance();

     

  • 相关阅读:
    [蓝桥杯] 练习系统-算法提高-ADV-292 【计算行列式】之10分钟AC Apare_xzc
    [洛谷] P1004 方格取数 Apare_xzc dp
    汤森路透 Thomson Reuters --使用多模型数据库ArangoDB 打造快速安全的简洁视图分析
    图数据库与关系数据库的实验对比——意大利商会 InfoCamere 案例
    尊重开源,且用且珍惜
    使用数据库创建的Flash 游戏- Pronto Move Shard
    NoSQL分布式数据库的独家见解- Adam Fowler
    融合RocksDB, Pregel, Fault-Tolerent Foxx & Satellite Collections 怎样使数据库性能提升35%?
    怎么用多模型数据库为复杂数据建模?--航空舰队实例
    动态数据源四种实现方案对比
  • 原文地址:https://www.cnblogs.com/zxtceq/p/8657729.html
Copyright © 2011-2022 走看看