`

设计模式面面观(3):单件模式(Singletion)-创建型模式

阅读更多

模式分类

从目的上来看

Ø 创建型模式

负责创建对象,封装对象创建行为

Ø 结构模式

处理类与对象间的组合关系

Ø 行为模式

封装类与类间的交互中的职责分配

从范围上来看

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

Ø 对象模式处理对象间的动态关系
单件模式(Singletion-创建型模式

重要声明:

故事纯属虚构,如有雷同请勿对号入座,故事只是为了抛砖引玉,虽以第一人称和作者本人网名起但不代表本人真实想法,请勿把故事中人物和作者本人联系起来,故事本意只为模式创造前提条件

角色:

ü 皇帝 主演WenSi

ü 贵妃 杨玉环

ü 嫔妃 西施

ü 宫女 小桃红

ü 太监 三德子

ü 官员 A

ü 官员 B

剧情:

开场白:最近迷上了《康熙微服私访记》做了一场白日梦(咨询了一下专业医生做白日梦有利于身心健康)作为至今光棍的我看康熙宫里粉黛3千还在外风流潇洒,自己也过会梦中的皇帝瘾。看看我的后宫生活:

Wensi :三德子

三德子:奴才三德子伺候陛下

Wensi :摆驾嫔妃宫

三德子:咋

到了嫔妃宫………

西施 :嫔妃西施叩见Wensi陛下

Wensi :爱妃请起。

旁白:一阵攀谈后

西施 :夜已深,奴婢伺候Wensi陛下

……………………………………………………………

旁白:天亮上朝,朝堂之上

官员A:陛下陕西今年蝗灾请求朝廷赈灾

Wensi:准奏,命内务府拨银30万两

官员B:陛下江苏今年黄河决堤,请求朝廷赈灾

Wensi:准奏,命内务府拨银300万两(偶老家拨多点哇哈哈)

………………………………………

旁白:众臣商议国家大事,突然宫女小桃红来报

小桃红:皇上,贵妃杨玉环快不行了

Wensi:退潮,三德子摆驾贵妃宫,快快

三德子:咋,皇上摆驾贵妃宫

旁白:来到贵妃宫,见玉环脸色苍白,不忍再看

Wensi:玉环,朕在你身边

杨玉环:陛下,臣妾能在死前再看您一眼,臣妾知足了

旁白:说完玉环香消玉殒

Wensi:玉环(皇帝痛心不已)

旁白:皇帝一声长叹说道

Wensi:三德子摆驾嫔妃宫,找西施玩去。(众人皆倒…………

呵呵最后搞怪了哈,故事就是故事大家不要浮想联翩哈,这个故事和我们今天要讲的模式有联系吗?有!大家看看我用红色标出来的对话就不难看出。天无二日,<personname productid="国无二" w:st="on">国无二</personname>君。在中华大地上只有一个皇帝,不会有第二个。不管在什么地方皇帝只有一个那就是我。让我们来看看我们如何用OOD来描述这些呢?

<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1026" style="WIDTH: 415.5pt; HEIGHT: 189.75pt" o:ole="" type="#_x0000_t75"><imagedata o:title="" src="file:///C:%5CDOCUME~1%5CADMINI~1%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image001.emz"></imagedata></shape>解释下为什么要这样做,用OOD的思想我们先从故事中可以知道一共用了几个角色,上面我已经罗列出来了,他们都人,他们都不同的地位(注意我的用此:是,有)。在设计中我们往往会出现具体角色(皇帝、贵妃。。。)直接继承与抽象类 人, 这是不对的!混淆了,is-ahas-a 的概念。地位和人类是聚合关系不是组合关系,就是说一个具体的个人不是生来就是皇帝不是生来就是封疆大吏,皇帝这个称号不是伴随着一个人从生到死,所以他们是地位的一种抽象。但一个人有自己的名字和年龄这个是生来就有的(有人会跟我钻牛脚尖说,人一出生是没有名字的,呵呵有意义吗)伴随着一个人的出生和死亡。

再看地位这个抽象类,因为有地位所以他们能做指挥比他地位低的人做事情所以这里他们共有一个Command方法.

再看接口伺候,皇帝是不用伺候别人的(父母除外)所以我没有把伺候的接口分给皇帝,其他角色都继承了伺候接口,这里是为了让大家理解下抽象和接口的异同何时用哪个更为妥当。

回过头来说说今天我们的主角皇帝,皇帝拥有自高无上的权利,在他的统治范围内不能用第二个皇帝所以他是我们单件模式的主角。老天爷下凡的儿子(即天子)只有一个人所以老天爷派下的皇帝始终都是一个(老天爷即一个简单的造人工厂)。

判定这个OOD设计是否合理我们依据我们第二章的设计模式原则来判定

1. 是否符合开闭原则

我们在新添一个角色敌人成员农民时只要继承地位类和接口伺候就可以了,没有修改任何其他内,同时做到了扩展,所以这个设计完成符合对内修改关闭和对外扩展的开闭原则

答案:符合

2. 是否符合里氏代换原则

我们在用抽现类地位去调用各个角色的Command方法时用具体角色的Command方法代替是没有问题的。

答案:符合

3. 是否符合合成复用原则

上面已经讲述过为何在人和具体角色之间多了地位的抽现类的原因,解释了is-ahas-a区别,所以这也是符合的

答案:符合

4. 是否符合依赖倒置原则

在老天爷这里我们创造出来的具体角色都是用抽象类地位返回的。

答案:符合

5. 是否符合接口隔离原则

皇帝没有继承接口伺候,其他的具体类都有

答案:符合

6. 是否符合抽象原则

不用多讲了

答案:符合

7. 是否符合迪米特法则

因为涉及到的方法很少所以这里看的不是太清楚,这里唯一能看出来的就是皇帝没有伺候的方法,他不关心这个所以也是符合的

答案:符合

总的来讲这个OOD设计是完全符合设计模式的要求的看看,OK下面来研究下皇帝这个单件类的实现。首先我们不能让别人随便的创建(NEW)一个皇帝类所以皇帝类的构造函数是私有的,通过自生一个静态方法提供给外界调用,皇帝类只能生成一次,其余再调用都是调用第一次生成的那个类

<shape id="_x0000_i1025" style="WIDTH: 115.5pt; HEIGHT: 48pt" o:ole="" type="#_x0000_t75"><imagedata o:title="" src="file:///C:%5CDOCUME~1%5CADMINI~1%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image003.emz"></imagedata></shape>

总结 :单件模式

意图

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

动机

项目中经常会有一些特殊需求的类,必须保证他们在系统

中有且只有一个实例,才能确保他们的逻辑的正确性后市良好的效率,如何绕过常规的构造器,提供一种机制来保证一个类的唯一性?

实用性

l 当类只能有一个实例而且客户可以从一个众所周知的地方访问它

l 当这个唯一实例应该是通过子类化可扩展,并且客户应该无需更改代码就能使用一个扩展的实例时。

结构

<shape id="_x0000_i1027" style="WIDTH: 138pt; HEIGHT: 75.75pt" type="#_x0000_t75" alt=""><imagedata src="file:///C:%5CDOCUME~1%5CADMINI~1%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image005.gif" o:href="http://www.cnblogs.com/images/cnblogs_com/zhenyulu/Pic52.gif"><font size="3"></font></imagedata></shape>

参与者

Singletion类,在我的CODE中即皇帝类(HuangDi

效果

单件模式优点:

1. 对唯一实例的受控访问

2. 缩小名空间:Singletion模式是对全局变量的一种改进,它避免了那些存储唯一实例的全局变量污染名空间。

3. 允许对操作和表示的精化Singletion类可以有子类,而其用这个扩展类的实例来配置一个应用是很容易的,用户可以根据需要配置自己的Singletion子类并做进一步的精化。

4. 允许可变数目的实例:在一些系统里Singletion类也许不需要唯一但需要固定数目的同类所以我们在Singletion类上定义一个阀值控制用户实例的个数。

代码

http://download.csdn.net/source/251706

http://www.winu.cn/thread-45247-1-1.html

重要补充说明:

代码中我只理想的做成单线程实现的在多线程中需要考虑线程问题,控制稍微麻烦点其实只要LOCK一下你的皇帝类中的静态生成皇帝类的方法即可。

分享到:
评论

相关推荐

    设计模式面面观(10):桥接模式(Bridge Pattern)-结构型模式

    设计模式之我见(1):设计模式概述 (100%) 设计模式面面观(2):设计模式基本要素与原则 (100%) 设计模式面面观(3):单件模式(Singletion)-创建型模式 (100%) 设计模式面面观(4):工厂模式...

    单件模式(Singletion)-创建型模式源代码

    单件模式(Singletion)-创建型模式

    Suno AI Download 免费下载Suno AI 音乐

    网站描述:Sunoaidownload——从分享链接中轻松下载Suno AI生成的歌曲文件 内容概要: 这是一个专门提供Suno AI生成的歌曲文件下载服务的网站,用户可以通过分享链接轻松获取所需文件。本网站提供高质量、多样化的音乐资源,满足不同用户的需求。 适用人群: 该网站适用于所有热爱音乐、需要音乐素材的用户,特别适合音乐创作者、音乐爱好者、学生、教师等人群使用。 使用场景: 该网站的使用场景非常广泛,具体包括以下几个方面: 1. 音乐创作:音乐创作者可以使用本网站提供的歌曲文件进行创作,丰富作品内容,提升作品质量。 2. 音乐学习:学生和教师可以使用本网站的歌曲文件进行音乐学习,提高音乐素养和技能。 3. 娱乐休闲:普通用户可以使用本网站的歌曲文件进行放松、娱乐和休闲,享受音乐带来的愉悦。 其他说明: 本网站提供高速、稳定的下载服务,确保用户能够快速获取所需文件。同时,我们注重版权保护,只提供合法授权的歌曲文件,避免侵犯他人权益。为了更好地服务用户,我们不断优化网站功能和用户体验,欢迎提出宝贵意见和建议。此外,为了保障用户数据安全,我们采取了先进的安全措施。

    基于Python的Django配置Celery设计源码

    本项目是基于Python的Django配置Celery设计源码,包含20个文件,其中主要包含17个py源代码文件。系统采用了Python编程语言,实现了Django配置Celery的功能。项目结构清晰,代码可读性强,易于理解和维护。

    物联网嵌入式ESP32开发例程05-FreeRTOS操作系统之时间片调度C程序代码.rar

    1、嵌入式物联网ESP32项目实战开发。例程经过精心编写,简单好用。 2、代码使用Visual Studio Code + ESP-IDF开发,C语言编程。例程在ESP32-S3上运行。若在其他型号上运行,请自行调整。 3、如果接入其他传感器,请查看发布的其他资料。 4、ESP32与模块的接线,在代码当中均有定义,请自行对照。 5、若硬件差异,请根据自身情况适当调整代码,程序仅供参考。 6、代码有注释说明,请耐心阅读。 7、技术v:349014857;

    华为IPMS流程优化策略glz.pptx

    华为IPMS流程优化策略glz.pptx

    文字转合成语音软件工具

    文字转语音软件,两款,都非常好用,亲测有效,免费声音足够使用,需要的兄弟自行下载

    工作汇报 年终总结5.pptx

    引言 年度工作回顾 系统进展与亮点 技术创新与应用 市场反馈与用户评价 存在问题与挑战 未来展望与计划 结束语与感谢 一、引言 简要介绍智能家居系统的重要性和发展趋势 回顾本年度的工作目标和重点 二、年度工作回顾 系统建设与维护 完成的项目与里程碑 系统稳定性与可靠性提升 团队建设与培训 团队成员构成与职责 培训与技能提升活动 合作伙伴与资源整合 与供应商、合作伙伴的合作情况 资源整合与利用 三、系统进展与亮点 功能扩展与优化 新增功能介绍与效果评估 现有功能的优化与改进 用户体验提升 界面设计与交互优化 用户反馈与改进措施 四、技术创新与应用 物联网技术的应用 传感器与通信技术的升级 大数据分析与应用 智能家居的智能化管理 自动化控制与节能策略 安全防护与预警系统 五、市场反馈与用户评价 市场反馈分析 市场需求与竞争态势 市场占有率与增长趋势 用户评价总结 用户满意度调查结果

    基于SpringBoot和OpenAI的聊天机器人设计源码

    本项目是基于SpringBoot和OpenAI的聊天机器人设计源码,包含1559个文件,其中主要包含605个java源代码文件,361个js脚本文件,238个vue前端文件等。系统采用了Java、JavaScript、Vue、CSS、HTML、Shell和TypeScript技术,实现了一个基于SpringCloud的Chatgpt机器人。该项目已对接GPT-3.5、GPT-4.0、百度文心一言、stable diffusion AI绘图、Midjourney绘图等AI技术。用户可以在界面上与聊天机器人进行对话,聊天机器人会根据用户的输入自动生成回复。项目结构清晰,代码可读性强,易于理解和维护。

    2024年全球控制膨胀合金箔行业总体规模、主要企业国内外市场占有率及排名.docx

    2024年全球控制膨胀合金箔行业总体规模、主要企业国内外市场占有率及排名

    电子通信设计资料多点温度检测系统设计论文资料

    电子通信设计资料多点温度检测系统设计论文资料提取方式是百度网盘分享地址

    基于Bootstrap的树形表格设计源码

    本项目是基于Bootstrap的树形表格设计源码,包含31个文件,其中主要包含7个js脚本文件,5个css样式文件等。系统采用了JavaScript、CSS和HTML技术,实现了基于Bootstrap的树形表格功能。该项目最初出现在guns项目中,基于jquery.treegrid.js实现树形结构,但由于性能问题,重新实现了相关功能。其用法与bootstrap-table类似。项目结构清晰,代码可读性强,易于理解和维护。

    基于STM32F4的智能门锁超详细解析(矩阵键盘、OLED、舵机、HC-05蓝牙、F407ZG最小系统)可用于毕业设计.zip

    基于STM32F4的智能门锁超详细解析(矩阵键盘、OLED、舵机、HC-05蓝牙、F407ZG最小系统)可用于毕业设计.zip

    万能文件查看器 支持各种文件格式.zip

    万能文件查看器 支持各种文件格式.zip

    电子通信设计资料智能健康监护仪的研究毕业设计论文资料

    电子通信设计资料智能健康监护仪的研究毕业设计论文资料提取方式是百度网盘分享地址

    2023年中老年奶粉行业展望.pptx

    行业研究

    YOLOv8训练飞机检测模型+权重+数据集

    1、YOLOv8训练飞机检测模型,并包含标注好的飞机检测数据集,标签格式为xml和txt两种,类别名为aeroplane, 2、数据集和检测结果参考:https://blog.csdn.net/zhiqingAI/article/details/124230743 5、采用pytrch框架,代码是python的

    asp.net基于三层模式实验室仪器设备管理系统源码.7z

    实验室设备仪器管理系统基于MVC思想和三层设计模式构建,前台采用bootstrap响应式框架,后台运用div+css技术,确保用户界面的友好与兼容性。在Visual Studio 2010或更高版本软件上进行程序开发,利用sqlserver2005或更先进的数据库系统提供稳定的数据支持。 该系统包含四个核心模块:实验室登陆模块、学生模块、教师模块和管理员模块。登陆模块提供用户注册和登陆功能,确保用户信息的准确与安全。学生模块提供实验课仪器设备的信息查询、借领仪器耗材、设备事故的登记等服务,满足学生在实验过程中的各种需求。 管理员模块功能丰富,包括实验室设备信息查询、设备事故记录、设备资料管理、设备损坏管理以及设备耗材借领等。管理员可以方便地查询和统计设备仪器信息,上报和处理设备事故,更新设备操作指南,管理设备损坏信息,以及处理设备耗材的借领和归还。 实验设备管理数据库是系统的核心部分,管理员可以添加、删除、更改设备信息,记录报废、维修、申请购买以及新增设备的详细信息。所有相关信息如报废表、维修表、设备购买申请表、新增设备属性表等都会在终端实时显示,确保信息的及时性和准确性。 此

    1急急急i几i积极急急急急急急急急急急急急急急急急急急急急急急急急积极

    1急急急i几i积极急急急急急急急急急急急急急急急急急急急急急急急急积极

    TIMIT数据集下载TIMIT数据集下载,种子资源。.zip

    TIMIT数据集下载TIMIT数据集下载,种子资源。

Global site tag (gtag.js) - Google Analytics