敏捷软件开发 - 原则、模式与实践 —— 设计模式(四)SINGLETON模式和MONOSTATE模式

速读《effective go》 effective go官方文档中文精简版 阅读详情

本文为敏捷软件开发 - 原则、模式与实践系列的一部分。

本文对应原书第16章

介绍

本节讲述了两个强制对象单一性的模式。这两个模式有着非常不同的“代价/收益”权衡。在大多数情况下,它们的实时代价远低于它们的表达力带来的收益。

SINGLETON模式

public class Singleton {  
	private static Singleton theInstance = null;  
	private Singleton() {}
	
	public static Singleton Instance()  {
		if (theInstance == null)        
			theInstance = new Singleton();      
		return theInstance;    
	}  
} 

上面是一个典型的有点瑕疵的SINGLETON实现

SINGLETON模式的好处
  • 跨平台:使用合适的中间件(例如,RMI),可以把SINGLETON模式扩展为跨多个JVM和多个计算机工作。

  • 适用于任何类:只需把一个类的构造函数变成私有的,并且在其中增加相应的静态函数和变量,就可以把这个类变为SINGLETON。

  • 可以透过派生创建:给定一个类,可以创建它的一个SINGLETON子类。
    延迟求值:如果SINGLETON从未使用过,那么就不会创建它。

SINGLETON模式的代价
  • 摧毁方法未定义:没有好的办法去摧毁一个SINGLETON,或者解除其职责。

  • 不能继承:从SINGLETON类派生出来的类并不是SINGLETON。如果要使其成为SINGLETON,必须要增加所需的静态函数和变量。

  • 效率问题:每次调用Instance方法都会执行if语句。就大多数调用而言,if语句是多余的。

  • 不透明性:SINGLETON的使用者知道它们正在使用一个SINGLETON,因为它们必须要调用Instance方法。

MONOSTATE模式

public class Monostate {  
	private static int itsX;
	public Monostate() {}

	public void setX(int x) {
		itsX = x;
	}

	public int getX() {
		return itsX;
	}
}
MONOSTATE模式的好处
  • 透明性:使用MONOSTATE对象和使用常规对象没有什么区别。使用者不需要知道对象是MONOSTATE。

  • 可派生性:MONOSTATE的派生类都是MONOSTATE。事实上,MONOSTATE的所有派生类都是同一个MONOSTATE的一部分。它们共享相同的静态变量。

  • 多态性:由于MONOSTATE的方法不是静态的,所以可以在派生类中覆写它们。因此,不同的派生类可以基于同样的静态变量表现出不同的行为。

MONOSTATE模式的代价
  • 不可转换性:不能透过派生将常规类转换为MONOSTATE类。

  • 效率问题:因为MONOSTATE是真正的对象,所以会导致许多的创建和摧毁开销。

  • 内存占用:即使从未使用MONOSTATE,它的变量也要占据内存空间。

  • 平台局限性:MONOSTATE不能跨多个JVM或者多个平台工作。

结论

常常会有必要强制要求某个特定对象只能具有单一实例。本章展示了两种非常不同的技术。SINGLETON模式使用私有构造函数,一个静态变量,以及一个静态方法对实例化进行控制和限制。MONOSTATE模式只是简单地把对象的所有变量变成静态的。

如果希望透过派生去约束一个现存类,并且不介意它的所有调用者都必须要调用instance()方法来获取访问权,那么SINGLETON是合适的。如果希望类的单一性本质对使用者透明,或者希望使用单一对象的多态派生类,那么MONOSTATE是最适合的。

完整内容请查看敏捷软件开发 - 原则、模式与实践系列

敏捷软件开发 - 原则、模式与实践 —— 敏捷开发(一) 本文对应原书第1章和第2章。 敏捷软件开发宣言 个体和交互 胜过 过程和工具 可以工作的软件 胜过 面面俱到的文档 客户合作 胜过 合同谈判 响应变化 胜过 遵循规则 敏捷开发原则 我们最优先要做的是通过尽早的、持续的交付有价值的软件来使客户满意 即使到了开发的后期,也欢迎改变需求。敏捷过程利用变化来为客户创造竞争优势 经常性的交付可以工作的软件,交付的间隔可以从几周到几个月... 阅读详情

相关推荐

敏捷软件开发 - 原则、模式与实践 —— 设计模式(十)PROXY模式和STAIRWAY TO HEAVEN模式

本文为敏捷软件开发 - 原则、模式与实践系列的一部分。 本文对应原书第26章 PROXY模式 PROXY模式具有一个非常大的好处:重要关系的分离。在上面的例子中,业务规则和数据库就被完全分开了。在那些把业务 规则和数据库实现分离显得非常重要的情况中,PROXY模式是很适用的。就此而言,PROXY模式可以用来分离业务规则和任何种类的实现问题。它可以用来防止业务规则被诸如:COM、COBRA、EJB...

feifeilb的博客 474

《敏捷软件开发》— 设计模式(一)

《敏捷软件开发》— 设计模式(一)一、Command 模式和 Active Object 模式1、Command 模式2、Active Object 模式 一、Command 模式和 Active Object 模式 1、Command 模式 我们在 《设计模式》— 行为型模式 — 命令模式中学习过命令模式。该模式可以将负责实现业务逻辑的模块与上层模块分离。 2、Active Object 模式 Active Object 模式是命令模式在多线程控制的具体应用。 ...

coding-hwz 654

卷积神经网络中的边缘检测:从Canny算法到深度学习(PyTorch实现)

本文系统梳理了边缘检测从经典Canny算法到深度学习方法的演进,重点解析了Canny算法的数学原理及其对卷积神经网络设计的深远影响。通过PyTorch实战,详细演示了如何构建并训练一个基于HED架构的深度学习边缘检测模型,并探讨了模型优化、评估及与传统方法融合的高级技巧。

jenkins8butler的博客 151

MonoState模式与SingleTon模式

[b]SigleTon模式[/b]可能是最为软件从业人员所知的一种模式了。但是与其有异曲同工之妙的[b]MonoState模式[/b]则不那么流行了。 在介绍MonoState之前先说一下SingleTon。SingleTon在静态存储区存储了自己的一个实例,这个实例持有业务需要的内容(也就是实例的属性)。通过对构造器的私有化,以及对克隆的限制达到控制单例实例数为一的目的。扩展开来...

zhuyufufu的专栏 323

DCN交换机通过boot模式升级

LIC导入成功后,输入enable进入特权模式,把网线接到通讯网口上,配置好对应interface vlan地址,在enable模式用 copy tftp://x.x.x.x/xxxxxx_nos.img nos.img待提示write ok时,reload设备完成升级。交换机启动后,在显示以下信息时输入“Ctrl+B”,一定得是手动按“Ctrl+B”进入的boot模式才能正常升级。升级交换机成功,在BootROM模式下,执行命令run或reboot,回到CLI配置界面。# 交换机通过boot模式升级。

m0_72501865的博客 946

华三R4900 G5服务器实战:用PMC P460-B4阵列卡配置RAID1+RAID6,并搞定CentOS 7.9安装(含热备盘设置)

本文详细解析了在华三R4900 G5服务器上使用PMC P460-B4阵列卡配置RAID1+RAID6混合阵列的全过程,包括热备盘设置和CentOS 7.9系统安装。通过实战步骤和性能优化建议,帮助企业IT人员高效部署高可用存储方案,特别适合需要数据冗余和系统稳定性的企业级应用场景。

weixin_29248653的博客 357

SINGLETON 模式和MONOSTATE 模式

Singleton 和 Monostate 都是用来实现单例模式的,但二者实现机制上有所不同。Singleton 模式使用私有构造函数,一个静态变量以及一个静态方法对实例化进行控制和限制;而Monostate 则是简单的把对象的所有变量都编程静态的。Monostate 模式实例:public class Monostate{    private static int x = 0;

salever的专栏 619

Isaac Sim 车辆动力学:从参数调优到户外仿真的挑战与实战

本文深入探讨了Isaac Sim在车辆动力学仿真中的应用,从参数调优到户外场景模拟的实战经验。详细解析了悬架系统、轮胎物理模型等核心参数的设置技巧,并分享了应对户外仿真挑战的实用方案。通过Vehicle Wizard高级使用和传感器配置,帮助开发者高效完成车辆仿真与算法开发。

weixin_29192211的博客 404

单例模式(Singleton模式)

在有些系统中,为了节省内存资源、保证数据内容的一致性,对某些类要求只能创建一个实例,这就是所谓的单例模式。 一、单例模式的定义与特点 单例(Singleton)模式的定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式。例如,Windows 中只能打开一个任务管理器,这样可以避免因打开多个任务管理器窗口而造成内存资源的浪费,或出现各个窗口显示内容的不一致等错误。 在计算机系统中,还有 Windows 的回收站、操作系统中的文件系统、多线程中的线程池、显卡的驱动程序对象、打印机的后台处理服务、应

qq_35784669的博客 1839

MLX90640 热成像 STM32

MLX90640 热成像

zhaocundang's blog 5005

CloudCompare 二次开发(41)——点云重建三维凸包并计算体积

本文介绍了如何结合PCL与CloudCompare实现点云三维凸包的构建与可视化。通过代码集成,在CloudCompare界面添加功能按钮,实现点云数据转换、凸包构建、体积计算以及可视化显示。具体步骤包括:1) 在UI中添加功能按钮;2) 将点云数据转换为PCL格式;3) 使用PCL的ConvexHull算法构建三维凸包;4) 计算并显示凸包体积;5) 将结果以点云和网格形式可视化显示。最终实现了点云凸包的自动构建与体积计算功能,为点云处理提供了实用工具。

点云侠的博客 193

敏捷软件开发 - 原则、模式与实践

起源 《敏捷软件开发 - 原则、模式与实践》是我接触到的第一本系统介绍软件设计的书籍,深刻影响了个人的软件开发习惯。它并不难懂,我一直推荐给身边的各个层次的程序员学习。 可对于一本接近500页的图书,很多人还是望而却步。一直都想写个关于这本书的速读,使更多的人了解它。但是最近又重新学习了一遍发现它之所以有价值不仅仅在于书中总结的原则和模式,更在于它提供的如何运用这些原则、模式的实践例子。忽略了大量...

feifeilb的博客 2377

[QMT量化交易小白入门]-三十五、如何将聚宽策略信号转为QMT实盘交易

Flask是一个轻量级的Web应用框架,它提供了简单而灵活的方式来构建Web应用程序。在本案例中,将使用Flask来搭建一个本地服务,用于监听来自jq2qmt.py脚本的交易信号,并根据信号执行相应的下单操作。

木头大左的博客 2692

推荐:《敏捷软件开发、原则、模式与实践》电子版

 内容简介 在这本书中,享誉全球的软件开发专家和软件工程大师Robert C.Martin将向您展示如何解决软件开发人员、项目经理及软件项目领导们所面临的最棘手的问题。这本综合性、实用性的敏捷开发和极限编程方面的指南,是由敏捷开发的创始人之一所撰写的。   ·讲述在预算和实践要求下,软件开发人员和项目经理如何使用敏捷开发完成项目。   ·使用真实案例讲解如何用极限编程来设计、测试、重构和结

Scrum中文网-博客 1318

YOLOv8改进 | 主干网络 | 将主干网络替换为轻量化的ShuffleNetv2【原理 + 完整代码】

yolov8,yolov8创新,yolov8改进

kay_545 2563

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

monostate 状态_敏捷软件开发(原则、模式与实践)第三部分 设计模式-读书笔记1...

第十三章 COMMAND模式和ACTIVE OBJECT模式COMMAND模式:该模式仅由一个具有唯一方法的接口。它只封装了一个没有任何变量的函数。通过对命令概率的封装,该模式解除了系统的逻辑互连关系和实践连接的设备之间的耦合。另一个常见用法:创建和执行食物操作。COMMAND模式中do()方法:记住它所执行的操作的细节;增加了undo()方法:取消do()方法中执行的操作,并把系统回复到原先的状...

weixin_39843078的博客 140

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

敏捷软件开发:原则模式与实践之笔记

 敏捷软件开发:原则模式与实践单一职责原则:SRP (Single Responsible Principle)就一个类而言,应该仅有一个引起它变化的原因。对于违反SRP的情形,可考虑FACADE或者PROXY模式重构. 开放封闭原则:对于扩展是开放的,对于更改是封闭获得封闭的办法:1使用抽象获得显式封闭 2使用数据驱动的方法获取封闭性 LiskOV替换原则:子类型必须

lipeionline的专栏 1077

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

保持对象的单一性 - singleton 和 monostate

        很多时候,我们需要一些特殊的类,这些类因为资源等原因而只能有一个实例,实现这样目的的方式可能有很多,而这里要说的两个模式,通过其表达方式的有效性,能给我们带来很好的“代价/收益”平衡。 记得在Robert Martin的经典作品:敏捷软件开发-原则、模式与实践 中,这两个模式也是被单独提出来的。       1. Singleton       这个大概是学习设计模式时最先能够

zcGate的专栏 1124

《敏捷软件开发读书笔记之二》

《敏捷软件开发读书笔记之二》 接下来,我将向大家介绍第三部分“薪水支付案例研究”和第四部分“打包薪水支付系统”这两部分的认识,以及从中得到的收获: 以下是我从第三部分“薪水支付案例研究”中学到的相关知识以及个人的一些总结: C...

dijieyi3539的博客 168

《敏捷软件开发》读书笔记(3)

《敏捷软件开发》读书笔记(3) 书中设计模式的汇总 命令类模式,分离执行和定义 CMD模式 其实是事件-事务绑定的模型: 可以用事件驱动,只要收到事件,执行绑定到事件对应的CMD对象.do方法就行,对于真正执行的事情无感知。解除了系统的逻辑互联关系和实际连接关系的设备之间的耦合。 事务型操作,把验证和执行分离,由执行框架完成验证和执行操作。解除了获取数据、验证数据、执行数据操作这种空间耦合,同时...

drumdream的博客 303

推荐书籍系列(2):敏捷软件开发――原则、模式与实践

又名: Agile Software Development: Principles, Patterns, and Practices 译者: 邓辉作者: (美)Robert C·Martin 邓辉 孟岩 审 isbn: 7302071977页数: 500出版社: 清华大学出版社出版年: 2003-9-1 在这本书中,享誉全球的软件开发专家和软件工程大师Robert C.Martin将向您...

weixin_30267785的博客 145

《敏捷软件卡发 原则 模式 实践》笔记 1

 模式11 Null Object可以使用NULL OBJECT来替代NULL检查,正象《重构到模式》中所说的,使用这种技术的一个原则是看能否使代码得到简化,如果不能,就没有必要使用。一个常用的做法是使用JAVA的匿名内嵌类来实现一个NULL  OBJECT,可以这样来检查是否为空对象if(e == Aclass.NULL) { //do something}2 "Singleton" v

yuedishuangzhong的专栏 253

敏捷软件开发 第十三章~第十七章

这几章主要讲了几个设计模式,分别是: Command (命令模式) Active Object (主动对象模式) Template Method (模板方法模式) Strategy (策略模式) Facade(外观模式) Mediator (中介者模式) Singleton (单例模式) Monostate (单态模式) Null Object (空对象模式) ...

weixin_30363817的博客 104

敏捷软件开发 - 原则、模式与实践 —— 设计模式(十二)STATE模式

本文为敏捷软件开发 - 原则、模式与实践系列的一部分。 本文对应原书第29章 STATE模式 STATE模式既具有switch/case语句的效率又具有解释迁移表的灵活性。 上图展示该模式的结构。Turnstile类拥有关于事件的公有方法以及关于动作的受保护方法。它持有一个指向TurnstileState接口的引用。当Turnstile的两个事件方法中的一个被调用时,它就把这个事件委托给Turn...

feifeilb的博客 563

敏捷软件开发 - 原则、模式与实践 —— 敏捷设计(八)包的耦合性原则

本文为敏捷软件开发 - 原则、模式与实践系列的一部分。 本文对应原书第20章后半部分 包的耦合性原则 无环依赖原则(ADP - The Acyclic Dependencies Principle ) 在包的依赖关系图中不允许存在环。 解除依赖环的方法 使用依赖倒置原则。 创建一个新包,把共同依赖的类移动到新包里面。 稳定依赖原则(SDP - The Stable-Dependencies P...

feifeilb的博客 497

敏捷软件开发 - 原则、模式与实践 —— 敏捷设计(一)设计的臭味

设计的臭味 僵化性 僵化性是指难以对软件进行改动,即使是最简单的改动。如果单一的改动会导致有依赖关系的模块中的连锁改动,那么设计就是僵化的。必须要改动的模块越多,设计就越僵化。 脆弱性 脆弱性是指,在进行一个改动时,程序的许多地方就可能出现问题。常常是,出现新问题的地方与改动的地方并没有概念上的关联。 牢固性 牢固性是指,设计中包含了对其他系统有用的部分,但是要把这些部分从系统中分离出...

feifeilb的博客 486
上一篇: 敏捷软件开发 - 原则、模式与实践 —— 设计模式(三)FACADE模式和MEDIATOR模式
下一篇: 敏捷软件开发 - 原则、模式与实践 —— 设计模式(五)NULL OBJECT模式
feifeilb
博客等级 码龄22年 22粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值