模式分类
从目的上来看
Ø 创建型模式
负责创建对象,封装对象创建行为
Ø 结构模式
处理类与对象间的组合关系
Ø 行为模式
封装类与类间的交互中的职责分配
从范围上来看
Ø 类模式处理类与子类的静态关系
Ø 对象模式处理对象间的动态关系
单件模式(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-a和has-a 的概念。地位和人类是聚合关系不是组合关系,就是说一个具体的个人不是生来就是皇帝不是生来就是封疆大吏,皇帝这个称号不是伴随着一个人从生到死,所以他们是地位的一种抽象。但一个人有自己的名字和年龄这个是生来就有的(有人会跟我钻牛脚尖说,人一出生是没有名字的,呵呵有意义吗)伴随着一个人的出生和死亡。
再看地位这个抽象类,因为有地位所以他们能做指挥比他地位低的人做事情所以这里他们共有一个Command方法.
再看接口伺候,皇帝是不用伺候别人的(父母除外)所以我没有把伺候的接口分给皇帝,其他角色都继承了伺候接口,这里是为了让大家理解下抽象和接口的异同何时用哪个更为妥当。
回过头来说说今天我们的主角皇帝,皇帝拥有自高无上的权利,在他的统治范围内不能用第二个皇帝所以他是我们单件模式的主角。老天爷下凡的儿子(即天子)只有一个人所以老天爷派下的皇帝始终都是一个(老天爷即一个简单的造人工厂)。
判定这个OOD设计是否合理我们依据我们第二章的设计模式原则来判定
1. 是否符合开闭原则
我们在新添一个角色敌人成员农民时只要继承地位类和接口伺候就可以了,没有修改任何其他内,同时做到了扩展,所以这个设计完成符合对内修改关闭和对外扩展的开闭原则
答案:符合
2. 是否符合里氏代换原则
我们在用抽现类地位去调用各个角色的Command方法时用具体角色的Command方法代替是没有问题的。
答案:符合
3. 是否符合合成复用原则
上面已经讲述过为何在人和具体角色之间多了地位的抽现类的原因,解释了is-a和has-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一下你的皇帝类中的静态生成皇帝类的方法即可。
分享到:
相关推荐
设计模式之我见(1):设计模式概述 (100%) 设计模式面面观(2):设计模式基本要素与原则 (100%) 设计模式面面观(3):单件模式(Singletion)-创建型模式 (100%) 设计模式面面观(4):工厂模式...
单件模式(Singletion)-创建型模式
软考官网--2024常见操作说明:包括如何绘制网络图、UML图、表格等 模拟作答系统是计算机技术与软件专业技术资格(水平)考试的电子化考试系统界面、作答过程的仿真系统,为各级别、各资格涉及输入和页面显示的部分题型提供体验性练习。
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
1.版本:matlab2022A。 2.包含:程序,中文注释,仿真操作步骤(使用windows media player播放)。 3.领域:遗传优化 4.仿真效果:仿真效果可以参考博客同名文章《基于遗传优化GA的三目标优化仿真》 5.内容:基于遗传优化GA的三目标优化仿真。遗传算法(Genetic Algorithm, GA)是一种模拟自然选择和遗传机制的全局搜索优化方法,广泛应用于解决复杂优化问题,包括具有多个目标的优化问题,即多目标遗传算法(Multi-Objective Genetic Algorithm, MOGA)。在这里,将三个目标函数进行统一的编码,通过单目标遗传优化的方式,同步求解三个目标函数的最优值。 6.注意事项:注意MATLAB左侧当前文件夹路径,必须是程序所在文件夹位置,具体可以参考视频录。
本项目使用了Sleep-EDF公开数据集的SC数据进行实验,一共153条整晚的睡眠记录,使用Fpz-Cz通道,采样频率为100Hz 整套代码写的较为简洁,而且有添加相应的注释,因此进行分享,而且不仅仅说是睡眠分期,也可以作为学习如何使用神经网络去进行时序数据分类问题的一个入门项目,包括怎么用GRU、LSTM和Attention这些经典网络结构。 网络结构(具体可查看network.py文件): 网络整体结构类似于TinySleepNet,对RNN部分进行了修改,增加了双向RNN、GRU、Attention等网络结构,可根据参数进行调整选择。 定义了seq_len参数,可以更灵活地调整batch_size与seq_len。 数据集加载(具体可查看dataset.py文件) 直接继承自torch的Dataset,并定义了seq_len和shuffle_seed,方便调整输入,并复现实验。 训练(具体可查看train.py文件):
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
5.3.1_1二叉树的先中后序遍历.mp420240404-134540.png
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
这个是一个JSP在线图书销售商城网站项目,管理员角色包含以下功能:管理员登录,管理员账号管理,会员用户管理,订单管理,图书分类管理,图书管理,新闻管理,评价管理等功能。用户角色包含以下功能:用户首页,最新图书查看,会员登录注册,商城公告新闻查看,查看图书详情,查看评论以及发表评论,查看购物车,查看我的订单等功能。
开发语言:Java JDK版本:JDK1.8(或11) 服务器:tomcat 数据库:mysql 5.6/5.7(或8.0) 数据库工具:Navicat 开发软件:idea 依赖管理包:Maven 代码+数据库保证完整可用,可提供远程调试并指导运行服务(额外付费)~ 如果对系统的中的某些部分感到不合适可提供修改服务,比如题目、界面、功能等等... 声明: 1.项目已经调试过,完美运行 2.需要远程帮忙部署项目,需要额外付费 3.本项目有演示视频,如果需要观看,请联系我v:19306446185 4.调试过程中可帮忙安装IDEA,eclipse,MySQL,JDK,Tomcat等软件 重点: 需要其他Java源码联系我,更多源码任你选,你想要的源码我都有! https://img-blog.csdnimg.cn/direct/e73dc0ac8d27434b86d886db5a438c71.jpeg
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
毕设-基于STM32的物联网农业监测与控制系统源码.zip毕设-基于STM32的物联网农业监测与控制系统源码.zip毕设-基于STM32的物联网农业监测与控制系统源码.zip毕设-基于STM32的物联网农业监测与控制系统源码.zip毕设-基于STM32的物联网农业监测与控制系统源码.zip毕设-基于STM32的物联网农业监测与控制系统源码.zip毕设-基于STM32的物联网农业监测与控制系统源码.zip
基于单片机的系统
JAVA五子棋手机网络对战游戏的设计与实现(源代码)
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。