知识需要不断积累、总结和沉淀,思考和写作是成长的催化剂
内容目录
老生常谈
GOF23种设计模式,想必都有听过或学习过,就是有四个人搞了一本书总结了在面向对象开发过程中常见问题的解决方案。
啥是模式?就是发现一种可识别的规律,比如色彩模式(简历模版也算)。模式也往往和抽象思维有关,分析事物共性,抽取事物共同的部分来帮助人们认识规律。
啥又是设计模式?就是对事物的重新定位整合来解决问题的一种模版一种套路。它是成熟的解决方案,解决类似的问题,这样我们可以站在巨人的肩膀上,更加优雅的开发设计。
(本手册尽可能采用口语化表达,便于代入,很基础的细节会删减,了解过设计模式者服用更佳,查漏温故,浏览起来会比较轻松)
进入正题,设计模式按功能分为三大类
创建型创建型设计模式,顾名思义用于对象的创建。提供创建对象就是如何New一个对象的通用方法。
1、Singleton单例单例模式使得一个类只有一个实例。通常像一些工具类,只需要初始化一个实例即可,不需要每次使用都去再实例化一个,这样可以解决些资源浪费。和静态类功能上类似,只不过单例是个对象实例。
套路1:通常三步走,私有构造函数禁止外部构造,公开静态方法提供给外部使用,私有静态变量保证唯一(这样只是单线程模式下适用)。外部通过Singleton.GetInstance()获取唯一对象实例。
{
private static Singleton instance;
private Singleton()
{
}
public static Singleton GetSingleton()
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
套路2:多线程下简单粗暴的方式就是lock加锁,让代码块只能有一个线程进入。
private static readonly object syncRoot = new object();public static Singleton GetSingleton()
{
lock (syncRoot)
{
if (instance == null)
{
instance = new Singleton();
}
}
return instance;
}
再优化一下,上面这种方法会导致多个线程都需要等待,无论实例是否已经创建。我们想在实例已经创建的情况下多线程就不需要等待,直接返回就行。在lock外面加个判断null可以保证以后的多线程访问不用排队等待。这就是双重锁定。
public static Singleton GetSingleton(){
if (instance == null)
{
lock (syncRoot)
{
if (instance == null)
{
instance = new Singleton();
}
}
}
return instance;
}