重头开始学23种设计模式:单例模式

最近感觉做程序又开始浑浑噩噩,对设计模式和算法基本了解,但基本不会用。所以打算最近1个月把设计模式和算法重新,温故而知新下。

首先从程序开发经常涉及到的23种设计模式开始,希望这次能更加熟练的运用设计模式来加强自己的开发能力。

首先从单例模式开始:

单例模式在我的理解是对程序对象的缓存,防止不断new,保持对象唯一性,提高程序性能。

namespace SinglePattern {
    class Program {
        static void Main(string[] args) {
            for (int i = 0; i < 100; i++)
            {
                Task.Run(() =>
                {
                    Singleton objSingleton = Singleton.GetInstance;
                });
            }
            Console.Read();
        }
    }

    public class Singleton
    {
        private static  Singleton _instance = null;
        private static readonly  object _obj = new object();
        private static bool _initialize = false;

        private Singleton()
        {
            
        }

        public static Singleton GetInstance
        {
            get
            {
                ////第一种写法
                if (_instance == null) {
                    lock (_obj) {
                        if (_instance == null) {

                            _instance = new Singleton();
                            Console.WriteLine("Create a singleton instance!");
                        }
                    }
                }
            
                //第二种写法
                //if (!_initialize)
                //{
                //    lock (_obj)
                //    {
                //        if (!_initialize)
                //        {
                //            _instance=new Singleton();
                //            _initialize = true;
                //            Console.WriteLine("Create a singleton instance!");
                //        }
                //    }
                //}
                return _instance;
            }
        }
    }
}

上面就是单例常用写法。但实际项目开发当中,我们不能对每一个类都要写成单例,所以解决这种情况,我就需要一个容器来保持单例。

把需要单例的对象保存进去。

下面是代码:

 

    public class Singleton
    {
        private static readonly IDictionary<Type, object> allSingletons;

        static Singleton()
        {
            allSingletons=new Dictionary<Type, object>();
        }

        public static IDictionary<Type, object> AllSingletons
        {
            get
            {
                return allSingletons;
            }
        }
    }

    public class Singleton<T> : Singleton
    {
        private static T _instance;

        public static T Instance
        {
            get
            {
                return _instance;
            }
            set
            {
                _instance = value;
                AllSingletons[typeof (T)] = value;
            }
        }
    }

 

posted on 2014-06-27 10:55  ~紫鱼~  阅读(278)  评论(0编辑  收藏  举报