成都创新互联网站制作重庆分公司

C#的单例模式实现-创新互联

    只能生成一个实例的类是实现了Singleton(单例)模式的类。以下为C#实现单例模式的方式。
    
方式一只使用于单线程环境
    // 把构造函数设为私有函数以禁止他人创建实例
    // 定义一个静态的实例在需要的时候创建该实例
    // 在Singlrton的静态属性Instance中只有在instance为null的时候才创建一个实例以避免
    // 重复创建
    // 把构造函数定义为私有函数
    public sealed class Singleton1
    {
        public int a = 2;
        private Singleton1() { }        private static Singleton1 instance = null;        public static Singleton1 Instance        {            get            {                if (instance == null)                    instance = new Singleton1();                return instance;            }        }    }     方式二虽然在多线程环境中能工作但效率不高     
// 每次通过属性Instance得到Singleton2的实例都会试图加上一个同步锁
    // 而加锁是一个非常耗时的操作在没有必要的时候应该尽量避免
    public sealed class Singleton2
    {
        public int a = 2;
        private Singleton2(){}
        private static readonly object syncObj = new object();
        private static Singleton2 instance = null;
        public static Singleton2 Instance
        {
            get
            {
                lock (syncObj)
                {
                    if (instance == null)
                        instance = new Singleton2();
                }
                return instance;
            }
        }
    }
    可行的解法 加同步锁前后两次判断实例是否已存在        
// 只有instance为null即没有创建时需要加锁操作。
    public sealed class Singleton3
    {
        private Singleton3() { }
        private static readonly Object syncObj = new Object();
        private static Singleton3 instance = null;
        public static Singleton3 Instance
        {
            get
            {
                if(instance == null)
                {
                    lock(syncObj)
                    {
                        if(instance == null)
                            instance = new Singleton3();
                    }
                }
                return instance;
            }
        }
    }
        推荐的解法一利用静态构造函数     
   // 在初始化静态变量instance的时候创建一个实例
    // 由于C#是在调用静态构造函数时初始化静态变量.NET运行时能够确保只调用一次静态构造
    // 函数保证只初始化一次instance
    public sealed class Singleton4
    {
        private Singleton4() { }
        private static Singleton4 instance = new Singleton4();
        public static Singleton4 Instance
        {
            get
            {
                return instance;
            }
        }
    }
        推荐的解法二 实现按需创建实例        
// 在内部定义了一个私有类型Nested。
    // 当第一次用到这个嵌套类的时候会调用静态构造函数创建Singleton5的实例instance
    public sealed class Singleton5
    {
        private Singleton5() { }
        public static Singleton5 Instance
        {
            get
            {
                return Nested.instance;
            }
        }
        class Nested
        {
            static Nested() { }
            internal static readonly Singleton5 instance = new Singleton5();
        }
    }
        扩展 定义一个表示总统的类型President可以从该类型继承出FrenchPresident    和AmericanPresident等类型。这些派生类型都只能产生一个实例        
public class President
    {
        private string name = "";
        private string country = "";
        public President() { }
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        public string Country
        {
            get { return country; }
            set { country = value; }
        }
    }
        
public sealed class FrenchPresident: President
    {
        private FrenchPresident():base() { }
        private static FrenchPresident instance = new FrenchPresident();
        public static FrenchPresident Instance
        {
            get { return (FrenchPresident)(Nested.instance); }
        }
        private class Nested
        {
            static Nested() { }
            internal static readonly FrenchPresident instance = new FrenchPresident();
        }
    }
       
 public sealed class AmericanPresident : President
    {
        private AmericanPresident() : base() { }
        private static AmericanPresident instance = new AmericanPresident();
        public static AmericanPresident Instance
        {
            get { return Nested.instance; }
        }
        private class Nested
        {
            static Nested() { }
            internal static readonly AmericanPresident instance = new AmericanPresident();
        }
    }
        实现泛型单例模式        
public class SingletonExample where T : class, new()
    {
        public static T Instance
        {
            get { return Nested.instance; }
        }
        private class Nested
        {
            static Nested() { }
            internal static readonly T instance = new T();
        }
    }
    public class Two: SingletonExample
    {
        public int a = 2;
        public void Show()
        {
            Console.WriteLine(a);
        }
    }

创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。

专业领域包括成都网站设计、成都网站建设、商城网站建设、微信营销、系统平台开发, 与其他网站设计及系统开发公司不同,创新互联公司的整合解决方案结合了帮做网络品牌建设经验和互联网整合营销的理念,并将策略和执行紧密结合,为客户提供全网互联网整合方案。
网页名称:C#的单例模式实现-创新互联
本文链接:http://cxhlcq.cn/article/dpsegp.html

其他资讯

在线咨询

微信咨询

电话咨询

028-86922220(工作日)

18980820575(7×24)

提交需求

返回顶部