一: 创建型设计模式(长视频)
二:结构型设计模式
三:行为型设计模式
/// <summary>
/// 1 单例模式(单线程和多线程) 减少对象的创建,让对象只创建一次.
/// 2 单例模式的三种写法
/// 3 单例模式的优缺点和应用场景
//Singleton singleton = new Singleton();//对象重用,避免重复构造 //for (int i = 0; i < 5; i++) //{ // //Singleton singleton = new Singleton(); //new在外和new在内的差距 // Singleton singleton = Singleton.CreateInstance(); // singleton.Show(); //}
私有构造函数,不允许外部随便new 新实例
创建一个静态类对象,并做初始化
private static Singleton _Singleton = null; private static object Singleton_Lock = new object(); public static Singleton CreateInstance() { //Singleton _Singleton = null; if (_Singleton == null)//对象初始化之后,不要再等待锁了 { lock (Singleton_Lock)//保证lock的方法体同一时刻只有一个线程可以进入 { Console.WriteLine("进入锁...."); Thread.Sleep(1000); if (_Singleton == null)//是保证第一次初始化之后,不再重复的初始化 { _Singleton = new Singleton(); } } } return _Singleton; } public static void DoNothing() { } public void Show() { Console.WriteLine("这里是{0}.Show", this.GetType().Name); }
调用
//Singleton singleton = new Singleton();//对象重用,避免重复构造 //for (int i = 0; i < 5; i++) //{ // //Singleton singleton = new Singleton(); // Singleton singleton = Singleton.CreateInstance(); // singleton.Show(); //} //Show(); //OtherClass.Show();
异步线程 创建了九个对象, 解释,同时进入了十个线程. 有9个线程赶到时正好对象对空
可以加锁的方式解决
但此种模式有缺陷
加sleep之后 所有线程都等待, 等到完成之后,才开始执行,
对象已经创建好了, 所有线程进来都发现不为空