单例模式,基础才是重中之重

作者: 单机游戏资讯  发布:2019-05-25

重回目录

    1.概述     单例格局(Singleton Pattern)又称单件形式,单例形式保障3个类仅有3个实例,并提供1个访问的他的全局访问点。一般我们得以让叁个全局变量使得1个对象被访问,但它不可能防范你实例化对个目的,二个最棒的秘诀就是,让类本人承担保存他的唯一实例,那些类能够确认保证未有其余实例能够被创立并且她能够提供二个造访该实例的不2诀窍。
    使用场面:当类只可以有贰个实例存在,并且能够在大局访问时,那几个唯1的实例应该能够透过子类达成扩展,并且用户不用变动代码就能够使用。前边学习过得工厂类常常被实例化为全局唯壹的单件,只怕的单件还恐怕有系统的军管日志的指标、关键字生成对象和外部设备接口对象等。
    结构:

    单件方式特点:

单例模式,基础才是重中之重。我们挂在嘴过的一句话便是“static是静态对象,在类第四回被运用,也许第3回被实例化时实践“,不过你是否确实领悟那句话,或然说

图片 1

       一 :单件类只可有二个实例。

你是还是不是有对那句话举行二个实际的印证,假如未有,那作者来带你做到本次旅行吗!

    代码:

       2 :单件类必须自己创设本身这惟1的实例。

先是有一张表,不会时时发生变化,比方分类表,他是一种树型结构表,结构可能是那样

图片 2图片 3Singleton
图片 4    public class Singleton
图片 5图片 6    图片 7{
图片 8        private static Singleton instance;
图片 9        private static readonly object syncRoot = new object();
图片 10        private Singleton()
图片 11图片 12        图片 13{
图片 14        }
图片 15        public static Singleton GetInstance()
图片 16图片 17        图片 18{
图片 19            if (instance == null)
图片 20图片 21            图片 22{
图片 23                instance = new Singleton();
图片 24            }
图片 25            return instance;
图片 26        }
图片 27    }

       三 :单件类必须给持有其余对象提供那一实例。

单例模式,基础才是重中之重。  

    单例情势提供了大局唯一的造访入口,易于调控可能产生的顶牛。
    单例情势因为Singleton类封装它的唯壹实例,那样她能够严俊的操纵客户怎么访问它以及何时造访他。
    单例形式是对静态方法的一种革新,首先制止了全局变量对系统的污染,其次他得以有子类,能够定义虚方法,具有多态性。而类中的静态方法是不能够被定义为虚方法,因而不具备多态性。
    单例模式,基础才是重中之重。2.实例     1.单件计数器
    最轻松易行的单例方式采取便是计数器,在依照Web的使用中,大家期待有1个大局计数器来计算单件的次数,为此我们要定义三个单件计数器:

单例模式,基础才是重中之重。    创办单件常用的主意:  

 1  /// <summary>
 2     /// 分类表       
 3     /// </summary>
 4     public partial class Common_Category : IDataEntity
 5     {
 6         //初始字段
 7         #region original field
 8 
 9         /// <summary>
10         /// ID
11         /// </summary>
12         public Int32 ID { get; set; }
13 
14         /// <summary>
15         /// 上级ID
16         /// </summary>
17         public Int32 ParentID { get; set; }
18  
19 
20         /// <summary>
21         /// 名称
22         /// </summary>
23         public String Name { get; set; }

图片 28图片 29Counter
图片 30图片 31    /**//// <summary>
图片 32    /// 计数器
图片 33    /// </summary>
图片 34    public class Counter
图片 35图片 36    图片 37单例模式,基础才是重中之重。{
图片 38        private int intCounter = 0;
图片 39        private static Counter MyCounter;
图片 40        public int Count()
图片 41图片 42        图片 43{
图片 44            intCounter = intCounter   1;
图片 45            return intCounter;
图片 46        }
图片 47        public static Counter GetInstance()
图片 48图片 49        图片 50{
图片 51            if (MyCounter == null)
图片 52图片 53            图片 54{
图片 55                MyCounter = new Counter();
图片 56            }
图片 57            return MyCounter;
图片 58        }
图片 59    }

       1:静态变量法,也叫惰性实例化;

 

    调用代码:

       贰:双重锁定。
     率先:静态变量法可怜好精晓,.net的运维机制决定了静态变量能够形成单件,静态变量是四个储存在内部存款和储蓄器中的变量。它的体制可以确定保证同不日常候只会设有叁个变量。为此大家特别轻便的能够写出如此的次序: 

先是,它在先后中会平常被调用,也正是说,会平时访问那张数据表,由于它的剧情基本不变,所以,笔者想到了static对象,下边笔者用static对象来产生那一个供给

图片 60            for (int i = 0; i < 10; i )
图片 61图片 62            图片 63{
图片 64                Console.WriteLine(Counter.GetInstance().Count());
图片 65            }

    **1:** 这种对于单线程运转的顺序来讲是纯属不荒谬的,举个例子运行2个asp.net程序,一般网址都基本用不到二十多线程,全数地点的例证就丰裕满意。不过只假若四线程呢?假若还要有多个线初阶决断instance==null,假若此时都为真,则开创了两上实例,那样就违反了单件的尺度。为此可举行下修改:

  

    2.拾二线程时的单例以及重复锁定
    在10二线程程序中,多少个线程同期做客Singleton类时,调用GetInstance()方法,会有比十分大希望引致创造多个实例,大家得以给进度加一把锁来拍卖。锁(Lock)是承接保险当三个线程位于代码的临界区时,另一个线程不能够跻身该临界区,倘使别的线程试图跻身锁定的代码,则他将一向守候(即被堵住),直到该对象被放走【MSDN】。 
    上边来看加锁的单例方式:

图片 66图片 67Code
图片 68图片 69非线程安全的单件#region 非线程安全的单件
图片 70图片 71       /**//// <summary>
图片 72       /// 定义自个儿的静态变量实例,默许值为null
图片 73       /// </summary>
图片 74       private static Singleton instance = null;
图片 75图片 76       /**//// <summary>
图片 77       /// 私有构造函数
图片 78       /// 之拥有不是public类型的,因为是为着制止产生new Singleton()发生更加多的实例
图片 79       /// </summary>
图片 80       private Singleton()
图片 81图片 82       图片 83{ }
图片 84图片 85       /**//// <summary>
图片 86       /// 生成实例方法
图片 87       /// </summary>
图片 88       /// <returns></returns>
图片 89       public static Singleton getInstance()
图片 90图片 91       图片 92{
图片 93           //固然实例未有被初叶化则实例化变量
图片 94           if (instance == null)
图片 95图片 96           图片 97{
图片 98               instance = new Singleton();
图片 99           
图片 100           }
图片 101           return instance;
图片 102       }
图片 103       #endregion

 1   /// <summary>
 2         /// 得到静态对象(一般表数据不发生变)
 3         /// </summary>
 4         /// <returns></returns>
 5         public static IList<Common_Category> GetCommon_CategoryModel
 6         {
 7             get
 8             {
 9                 return new LinqDBDataContext().Common_Category.ToList();
10             }
11         }

图片 104图片 105Singleton
图片 106    public class Singleton
图片 107图片 108    图片 109{
图片 110        private static Singleton instance;
图片 111        private static readonly object syncRoot = new object();
图片 112        private Singleton()
图片 113图片 114        图片 115{
图片 116        }
图片 117        public static Singleton GetInstance()
图片 118图片 119        图片 120{
图片 121            lock (syncRoot)
图片 122图片 123            图片 124{
图片 125                if (instance == null)
图片 126图片 127                图片 128{
图片 129                    instance = new Singleton();
图片 130                }
图片 131            }
图片 132            return instance;
图片 133        }
图片 134    }

    **

 

    上边的代码中的对象实例由初次进入的非常线程创立,现在的线程在进入时不会再去创造对象实例了。由于有了Lock,就保险了多线程情形下的还要做客也不会促成四个实例的变迁。
    大家不经要问,为何不直接lock呢,而是创造四个SyncRoot来Lock呢?因为在大家加锁的时候,instance实例有未有被创设超过实际例大家都还不晓得吗,大家不容许对其加锁的。下边大家=每一遍调用GetInstance()方法时,都亟需Lock,那样会影响属性的。所以大家再做一定的精雕细琢优化,看上边包车型地铁代码:

    **2:**这种措施在程序初阶化时对类实例实行了早先化,利用静态变量以及个人构造方法实现了单件的调换。之所以称这种情势是惰性实例化**,是因为不管你是或不是调用那几个实例,它都会被创设。

本文由bg游戏资讯发布于单机游戏资讯,转载请注明出处:单例模式,基础才是重中之重

关键词: 设计模式 MVC ASP.NET 系统架构