设计模式(一)单例模式:创建模式

szlblog 2018-01-11 原文

先聊一下关于设计的几个原则
(1)单一原则(SRP):一个类应该仅有一个引起它变化的原因 :意思就是 (一个类,最好只负责一件事情,并且只有一个引起它变化的原因
(2)开闭原则(OCP): 应该对扩展开放,但是对修改关闭:意思是(模块通过扩展的方式去应对需求的变化,应该尽量在不修改源代码的基础上面扩展)
(3)依赖倒置原则(DIP):高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象
         高层模块不应该直接依赖于底层模块的具体实现,而应该依赖于底层的抽象。模块间的依赖是通过抽象发生,不发生直接的依赖关系,依赖关系是通过接口或抽象类为中间件产生的。
(4)LisKov 替换原则(LSP)(里式替换原则) :子类对象可以替换父类对象的位置    这里如果想了解的更清晰的话 了解一下 (斜变/逆变)
(5) 接口的隔离原则(IPS):(1)是不应该强行要求客户端依赖于它们不用的接口;(2)是类之间的依赖应该建立在最小的接口上面。简单点说,客户端需要什么功能,就提供什么接口,对于客户端不需要的接口不应该强行要求其依赖;类之间的依赖应该建立在最小的接口上面,这里最小的粒度取决于单一职责原则的划分。
      还有其他 理解不深可就没敢说出来.

设计模式(1)单例模式(创建模式)

注意事项:

1.  允许子类派生
2. 不要实现 icloneable 接口  https://msdn.microsoft.com/zh-cn/library/system.icloneable.aspx 这个接口继承后可能会导致生成多个示例,违背了模式的原本意思
3. 不要序列化  理由同上
4. 不要再多线程下使用,(如果需要再多线程下使用的话见下面举例)

单利模式作用
 (1)确保一个类只有一个实例;

 (2)提供一个访问它的全局访问点

利用代码实现一个简洁的单例

  1. class SingletonClass
  2. {
  3. private static volatile SingletonClass instance = new SingletonClass();
  4. //私有的构造函数
  5. private SingletonClass()
  6. {
  7. }
  8. public static SingletonClass Newinstance
  9. {
  10. get
  11. {
  12. return instance;
  13. }
  14. }
  15. }

           这个类在被调用时 SingletonClass.Newinstance();

           优点:(1)确保一个类只有一个实例;

                     (2)提供一个访问它的全局访问点

           缺点:(多线程环境下就会破坏单利的初衷:会形成多个类的实例)

 

利用代码实现  在多线程环境下的单例

  通过双重判断 对资源进行锁定 确保再多线程环境下确保只有一个实例

  注意:代码注释

  1. class multithreading_Singleton
  2. {
  3. //为了以防万一的出现
  4. //volatile 关键字作用 当编译编译过程中 会对代码进行细微的调整,为了防止代码发生改变保证代码原意不变 多线程使用时有可能会导致 顺序发生改变 导致多个实例的发生
  5. private static volatile multithreading_Singleton example = null;
  6. //声明一个资源锁
  7. private static object Lock = new object();
  8. //私有的构造函数
  9. private multithreading_Singleton()
  10. {
  11. }
  12. public static multithreading_Singleton Newinstance
  13. {
  14. get
  15. {
  16. //保证多个线程不会同时进入判断
  17. if (example == null)
  18. {
  19. //对资源进行锁定 Lock 只要是object 下的类型就OK了
  20. lock (Lock)
  21. {
  22. if (example == null)
  23. {
  24. example = new multithreading_Singleton();
  25. }
  26. }
  27. }
  28. return example;
  29. }
  30. }
  31. }

利用代码实现   单线程多线程通用单例

优点:静态构造函数 在调用时 只会产生一个,系统在默认的情况下仿佛已经对资源加过锁
缺点是不能带参数   
原因: (1):静态函数不允许不允许出现访问修饰符
            (2):静态构造函数必须无参数

  1. class SingletonCurrency
  2. {
  3. public static readonly SingletonCurrency example = new SingletonCurrency();
  4. private SingletonCurrency() { }
  5. }

         下面代码是读上面代码的解释代码:

              public static readonly SingletonCurrency example = new SingletonCurrency();  等同于省略了静态构造函数,这里的省略不是编译上的省略而是代码上的省略,在系统编译时还是会有一个静态构造的

  1. class SingletonCurrency_Remark
  2. {
  3. public static readonly SingletonCurrency_Remark example ;
  4. /// <summary>
  5. /// 静态构造函数
  6. /// </summary>
  7. static SingletonCurrency_Remark()
  8. {
  9. example = new SingletonCurrency_Remark();
  10. }
  11. private SingletonCurrency_Remark() { }
  12. }

 

推荐书籍     大话设计模式 (中文)   《Head First 设计模式》

希望大家指出不足之处  谢谢

发表于 2018-01-11 20:40 乐途 阅读() 评论() 编辑 收藏

 

版权声明:本文为szlblog原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/szlblog/p/8270491.html

设计模式(一)单例模式:创建模式的更多相关文章

  1. 设计模式–代理模式

    Proxy Pattern,23种常用的面向对象软件的设计模式之一。(设计模式的说法源自《设计模式》一书,原名 […]...

  2. Java设计模式之策略模式与状态模式

    版权声明:本文出自汪磊的博客,转载请务必注明出处。 一、策略模式定义 定义:策略模式定义了一系列的算法,并将每 […]...

  3. C#设计模式之十七观察者模式(Observer Pattern)【行为型】

    一、引言    今天是2017年11月份的最后一天,也就是2017年11月30日,利用今天再写一个模式,争取下 […]...

  4. Java进阶篇 设计模式之十四 —– 总结篇

    前言 本篇是讲述之前学习设计模式的一个总结篇,其目的是为了对这些设计模式的进行一个提炼总结,能够通过查看看此篇 […]...

  5. 软件设计模式学习(二十二)备忘录模式

    备忘录模式提供了一种对象状态的撤销实现机制,当系统中某一对象需要恢复到某一历史状态时可以使用备忘录模式来进行设 […]...

  6. Yii2设计模式——静态工厂模式

    应用举例 yii\db\ActiveRecord //获取 Connection 实例 public stat […]...

  7. 观察者模式,无需多线程完成数据监听

    大家好,我们今天来了解一个新的设计模式——观察者模式。 观察者模式的思路很简单,它被广泛地用在各种数据监控上。 […]...

  8. 设计模式漫谈之

    天太热,失眠了,实在睡不下去,就再写篇文章来静静心吧,我为什么写设计模式,因为设计模式是思想上的东西,程序员的 […]...

随机推荐

  1. 零基础学习大数据最完整的学习路线

    最近很多人都想学习大数据开发,但是却不知道如何开始学习,今天软妹子专门整理了一份针对大数据初学者的大数据开发学 […]...

  2. Python 元类

    本文通过Python实现单例模式一步步理解元类。 印象中,是在创建单例模式时知道可以用到元类(metaclas […]...

  3. 腾讯通信云服务端使用心得,腾讯云IM

    腾讯通信云服务端使用心得   1.腾讯通信服务入口并创建应用   方便使用保留url地址 :   https: […]...

  4. 41道计算机网络高频面试题(附带答案)

    史上最全,不接受反驳!!!!!!!文末也给出了 PDF 版本哦 1、说一说三次握手 当面试官问你为什么需要有三 […]...

  5. 性能测试监控 – zouhui

    性能测试监控 2018-02-28 13:34  zouhui  阅读(4178)  评论(0)  编辑  收 […]...

  6. HTML5 Maker

    HTML5 Maker 是一个在线动画制作工具,帮助你使用 HTML,CSS 和 JavaScript 创建动 […]...

  7. 五款交互设计APP界面欣赏

    食品O2OAPP界面,这种色调是让人很有食欲,很温暖的感觉   音乐APP设计界面         阅读APP […]...

  8. 谈谈最近副业挣钱的感受,一要形成体系,二要找平台加持

        最近我的博文发表得比较少,因为除了主业之外,我把时间都用在录制视频和写书等方面。这几天正好录制完一门课 […]...