c#设计模式,单例模式,利用静态构造函数设计的单例模式,你见过没?

博客 动态
0 131
张三
张三 2021-07-07 21:53:57
悬赏:1 积分 收藏

c#设计模式,单例模式,利用静态构造函数设计的单例模式,你见过没?

什么是单例模式

单例模式(Singleton Pattern)是 C#中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

单例模式实现的条件

  • 1、单例类只能有一个实例。
  • 2、单例类必须自己创建自己的唯一实例。
  • 3、单例类必须给所有其他对象提供这一实例。

单例模式介绍

意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

主要解决:一个全局使用的类频繁地创建与销毁。

何时使用:当您想控制实例数目,节省系统资源的时候。

如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。

关键代码:构造函数是私有的。

优点:

  • 1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。
  • 2、避免对资源的多重占用(比如写文件操作)。

缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。

使用场景:

  • 1、要求生产唯一序列号。
  • 2、WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。
  • 3、创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。

单例模式的实现

双检锁/双重校验锁 简称双if+lock

使用双if+lock这种方式实现最大的优点就是线程安全,缺点是加锁影响效率。

源码

  //双if+lock

    class Sigleton

    {

        private Sigleton()

        {

        }

        private static Sigleton  _Sigleton=null;

        private static Object sigleton_lock = new object();

        public static Sigleton CreateInstance()

        {

            if(_Sigleton==null)

            {

                lock (sigleton_lock)

                {

                    if (_Sigleton == null)

                    {

                        _Sigleton = new Sigleton();

                    }

                }

            }

            return _Sigleton;

        }

}

懒汉式单例-----利用静态构造函数

首先介绍静态构造函数

1静态函数没有修饰符修饰(默认修饰符为private,但是你不能写出来)

 

 2.静态构造函数是系统默认调用的,程序员无法手动调用

 

 3.如果类中没有静态构造函数,而此时类中包含静态字段(未初始化的)那么此时编译器会默认生成静态构造函数

 

4.在静态类中或方法中,不能使用对象

 

5.如果类中包含静态成员,且没有被初始化,系统会默认提供一个默认的值,这也间接说明了我们不可以直接调用静态构造函数,这也没办法控制静态函数的执行时间

 

6.静态构造函数只能被调用一次,并且不能有重复

 

 7.静态构造函数不能有参数

 

8.虽然静态构造函数和普通构造函数名字一样,但是系统规定他俩可以共存,尽管参数列表一样

 

9.静态构造函数是在普通构造函数调用之前执行,一般情况下用于初始化静态字段或者拦截在实例化之前

 

 静态构造函数:CLR保证,在第一次使用这个类之前,调用而且只调用一次

源码

 //单利模式第二种写法

    class SigletonSecond

    {

        private SigletonSecond()

        {

        }

        private static SigletonSecond _Sigleton = null;

       //静态构造函数:由CLR保证,在第一次使用这个类之前,调用而且只调用一次

        static SigletonSecond()

        {

            _Sigleton = new SigletonSecond();

        }

        public static SigletonSecond CreateInstance()

        {

            return _Sigleton;

        }

}

懒汉式

静态变量:会在类型第一次使用的时候初始化,而且只初始化一次

源码

 //单利模式第三种写法

    class SigletonThird

    {

        private SigletonThird()

        {

        }

        //静态变量:会在类型第一次使用的时候初始化,而且只初始化一次

        private static SigletonThird _Sigleton = new SigletonThird();

      

        public static SigletonThird  CreateInstance()

        {

 

            return _Sigleton;

        }

}

总结

在内存中只有一个对象,节省内存空间;

 

避免频繁的创建销毁对象,可以提高性能;

 

避免对共享资源的多重占用,简化访问;

 

为整个系统提供一个全局访问点。

 

 

 

 

回帖
    张三

    张三 (王者 段位)

    1091 积分 (1)粉丝 (20)源码

     

    温馨提示

    亦奇源码——源码分享社区

    最新会员