李建忠老师讲的《面向对象设计模式纵横谈》,早就看过了,现在有了时间重新整理一下,以前的博客【赛迪网】没有了,现在搬到博客园,重新过一遍,也便于以后浏览。

设计模式从不同的角度分类会得到不同的结果。设计模式可以从【目的】和【范围】两个角度来看看。

模式分类

从目的来看【这个分来是广泛使用的】

-创建型(Creational)模式:负责对象的创建

-结构型(Structural)模式:处理类与对象间的组合关系

-行为型(Behavioral)模式:类与对象交互中的职责分配的问题

从范围来看

-类模式处理类与子类的静态关系

-对象模式处理对象间的动态关系

动机(Motivation)

在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。

如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?

这应该是类设计者的责任,而不是使用者的责任

意图(Intent)

保证一个类仅有一个实例,并提供一个该实例的全局访问点

结构(Structure)

单线程Singleton模式实现

私有的实例构造器是为了屏蔽默认产生的构造器,让类的使用者无法调用构造器。

单线程Singleton模式的几个要点

Singleton模式中的实例构造器可以设置为protected以允许子类派生。

Singleton模式一般不要支持ICloneable接口,因为这可能会导致多个对象实例,与Singleton模式的初衷违背。

Singleton模式一般不要支持序列化,因为这也有可能导致多个对象实例,同样与Singleton模式的初衷违背。

Singleton模式只考虑到了对象创建的管理,没有考虑对象销毁的管理。就支持垃圾回收平台和对象的开销来讲,我们一般没有必要对其销毁进行特殊的管理。

不能应对多线程环境:在多线程环境下,使用Singleton模式仍然有可能得到Singleton类的多个实例对象。

多线程Singleton模式实现

volatile修饰:编译器在编译代码的时候会对代码的顺序进行微调,用volatile修饰保证了严格意义的顺序。一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。

使用.NET类型初始化机制实现多线程Singleton模式

以上是内联初始化(生成的同时进行初始化)的单例模式,它等同于:

内联初始化其实是把静态的字段放到静态构造器去初始化。反编译出内联初始化的代码可以看出以上结论

只要想访问静态字段,必定已经在之前执行了静态构造器。这样也能够精确地保证使用的时候一定能拿到实例,如果不使用也不会实例化对象,也就是延时加载的功能。他同样能够支持多线程环境,因为只可能有一个线程执行静态构造器,不可能有多个线程去执行静态构造器,感觉就是程序已经自动为我们加锁了。

它的一点弊端就是它不支持参数化的实例化方法。在.NET里静态构造器只能声明一个,而且必须是无参数的,私有的。因此这种方式只适用于无参数的构造器。

Singleton模式扩展

将一个实例扩展到n个实例,例如对象池的实现。(n不是指无限个实例,而是固定的某个数)

将new构造器的调用转移到其他类中,例如多个类协同工作环境中,某个局部环境只需要拥有某个类的一个实例。

理解和扩展Singleton模式的核心是“如何控制用户使用new对一个类的实例构造器的任意调用”。

.NET框架中的Singleton应用

t1==t2 这说明,GetType方法获得的Type实例都是单例。

HttpContext.Current也是如此,他们是通过Singleton的扩展方式实现的,他们的单例也并不是覆盖所有领域,只是针对某些局部领域中,是单例的,不同的领域中还是会有不同的实例。

推荐参考书

《设计模式:可复用面向对象软件的基础》 GoF

《面向对象分析与设计》 Grady Booch

《敏捷软件开发:原则、模式与实践》 Robert C.Martin

《重构:改善既有代码的设计》 Martin Fowler

《Refactoring to Patterns》 Joshua Kerievsky

以上书籍是李建忠老师推荐的,是关于设计模式,重构,原则阐述很好,很经典的书籍。

转载于:https://www.cnblogs.com/PatrickLiu/p/6164558.html

面向对象设计模式纵横谈:Singelton单件模式(笔记记录)相关推荐

  1. C#面向对象设计模式纵横谈——Singleton单件(创建型模式)

    Singleton单件(创建型模式) 动机(Motivation) 在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性.以及良好的效率. 如何绕过常规的 ...

  2. 学习C#面向对象设计模式纵横谈---笔记

    东西太多了.我比较侧重于实用,对理论性太强的东西,有种排斥的感觉. 先记着几点吧. Abstract Factory模式的几个要点:  如果没有应对:"多系列对象构建"的需求变化, ...

  3. C#面向对象设计模式纵横谈

    http://115.com/file/bhifcm6d# C#面向对象设计模式纵横谈(1):面向对象设计模式与原则.rar http://115.com/file/bhifcvb4# C#面向对象设 ...

  4. 设计模式学习之单件模式singleton

    定义 单件模式是一种用于确保整个应用程序中只有一个类实例且这个实例所占资源在整个应用程序中是共享的程序设计方法(根据实际情况,可能需要几个类实例).在某些情况下,这种程序设计方法是很有用处的. 单件模 ...

  5. C语言和设计模式(之单件模式)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 有过面试经验的朋友,或者对设计模式有点熟悉的朋友,都会对单件模式不陌生.对很多面试官而言,单件 ...

  6. 面向对象设计模式纵横谈:Prototype 原型模式(笔记记录)

       有一段时间没写东西了,今天继续把没写完的设计模式写完,今天这堂课是创建型设计模式的最后一堂课,原型设计模式,它同样也是解决了对象在创建的过程中的解耦合的情况,面对变化使代码更稳定,更准确的说是使 ...

  7. C#面向对象设计模式纵横谈——6.Prototype 原型模式(创建型模式)

    动机(Motivation) 在软件系统中,经常面临着"某些结构复杂的对象"的创建工作.由于需求的变化,这些对象经常面临着剧烈的变化,但他们却拥有比较稳定一致的接口. 如何应对这种 ...

  8. [导入]C#面向对象设计模式纵横谈(17):(行为型模式) Mediator 中介者模式.zip(8.75 MB)...

    讲座内容: 本培训课程探讨GoF23之 Mediator 中介者模式的意图.动因.原理.应用场景与C#语言实现,以及该模式在.NET框架程序设计中的具体应用. 课程讲师: 李建忠 上海祝成信息科技有限 ...

  9. [导入]C#面向对象设计模式纵横谈(10):Decorator 装饰模式(结构型模式).zip(9.84 MB)...

    讲座内容: 本培训课程探讨GoF23之Decorator 装饰模式的意图.动因.原理.应用场景与C#语言实现,以及该模式在.NET框架程序设计中的具体应用. 课程讲师: 李建忠 上海祝成信息科技有限公 ...

最新文章

  1. mysql布隆过滤器源码_布隆过滤器(Bloom Filter)的原理和实现
  2. java收费对.net_网上订货商城系统是怎么收费的?大概需要多少费用?
  3. MyBatis:参数传递 [转]
  4. 改变bantchsize发现loss增大_肺内发现磨玻璃结节,一定就是早期肺癌吗?
  5. Netflix CEO:入华谈判进展顺利 或很快获牌照
  6. Cloud for Customer的Inplace Edit Container
  7. 非常恶俗地分享一首歌曲(童年·葫芦娃)
  8. javascript 里Array的一些方法
  9. CentOS7 最小化安装后的必备操作
  10. astr在python_python学习之初识字符串
  11. 一公顷等于多少平方米
  12. JSK-372 图案输出【入门】
  13. 实例化vue发生了什么?(详解vue生命周期)
  14. PCA算法原理及实现
  15. linux设备模型:固件设备及efi固件(平台)设备节点创建过程分析
  16. 华为工作十年离职感想
  17. 关于 error: invalid types ‘int[int]‘ for array subscript 的解决
  18. 用JAVA实现简单点餐系统
  19. android svg路径动画,Android和播放SVG动画
  20. GitLab基础:如何将备份恢复至更高版本的GitLab

热门文章

  1. 告别beta版-Google Daydream SDK 1.0正式版发布并支持Unity原生开发
  2. AI,来感受被「分手厨房」支配的恐惧吧!
  3. 这个AI让马斯克头秃,还能帮他设计特斯拉
  4. 用deepfake拍电影可以安排了:迪士尼发布首个百万像素高分辨率换脸算法
  5. 为什么有些画面让你终生难忘?GAN来告诉你原因
  6. 马化腾首谈腾讯开源时,鹅厂已在Github上放出82个项目,标星24万+ | 附AI项目链接...
  7. 马斯克发布脑机接口系统!芯片直连大脑,激光开颅放置,可用iPhone操控,网友炸了:这就是黑客帝国...
  8. Python的流程控制 - for序列
  9. CentOS 中使用yum时常见的一种提示信息
  10. SAP BW/4 HANA亮点解析