Singleton模式和Mono-State模式
类和实例
- 对于大多数的类,都可以创建多个实例.在需要和不需要时,创建和删除这些实例.该过程会伴随着内存的分配和归还.
- 同时,有一些类,应该仅有一个实例.该实例在程序启动/结束时被创建和删除.
- root对象.通过该对象可以得到系统中的其他对象.
- factory对象.用来创建系统中的其他对象.
- manager对象.负责管理和控制其他对象.
- 对于这些对象,如果创建了多份,那么就会发生逻辑错误.
- 通常情况下,强制对象单一性的机制有些多余.完全可以在程序启动时只创建该对象的一个实例.
- 不过,使用模式能够传达我们的意图(该类仅能有一个实例).
- 代价/收益:如果强制对象单一性的机制是轻量级的.那么传达意图的收益会胜过实施这些机制的代价.
- Singleton模式
- 实现: private new(); private static theInstance; public static Instance();
- 收益:
- 适用于任何类:只需把类的构造变为private,并增加相应的static变量和方法.
- 可以透过派生创建.
- 延迟求值(lazy evaluation):只有真正使用时,才会创建对象.
- 代价:
- destory()未定义:由于持有Sigleton实例的模块很多,即使将该实例=null.随后对其方法的调用仍然会创建另一个新的实例.
- 不能继承:从Singleton类派生的类不是Singleton.而必须加入static的处理.
- 效率问题:每次调用Instance()都会进行if判断,很多情况下,是多余的.
- 不透明性:Singleton的使用者不知道其使用的是一个Singleton类.
- Mono-State模式
- 实现: 简单地把对象的所有变量变成static.而方法都是普通方法(非static).
- 所有的实例,看起来就像具有不同名称的同一对象一样.即使当前所有的实例都被销毁,也不会丢失Data.
- 收益:
- 透明性:Mono-State对象和regular对象在使用上没有区别.
- 可派生性:派生类也会共享相同的static var.
- 多态性: 方法是非静态的,不同的子类可以基于同样的static var拥有不同的表现.
- 代价:
- 不可转换型: 不能透过派生来把常规类转换为Mono-State类.
- 效率: Mono-State对象是真正的对象,创建许多个会有开销.
- 内存: 只要创建了,即使还未使用,就已经占用了内存.
- 对比:
- Singleton强制结构上的单一性.
- Mono-State强制行为上的单一性.
- Mono-State的测试case对Singleton是有效的.但是反之不行.
- 如果希望透过派生去约束一个现存类,并且不介意它的所有调用者都必须要调用instance()来获取访问权,使用Singleton.
- 如果希望类的单一性本质对调用者透明,或者使用单一对象的多态派生对象.使用Mono-State.
[Agile Software Development(Principles,Patterns,and Pracitices)]
Singleton模式和Mono-State模式的更多相关文章
- Java设计模式(19)状态模式(State模式)
State的定义:不同的状态,不同的行为:或者说,每个状态有着相应的行为. 何时使用状态模式 State模式在实际使用中比较多,适合"状态的切换".因为我们经常会使用If else ...
- Behavioral模式State模式
1.意向 同意一个目标,然后改变其内部状态,改变它的行为. 对象似乎改变它的类别. 2.别名 状态对象(Objects for States) 3.动机 考虑一个表示网络连接的类TCPConnecti ...
- State模式(状态设计模式)
State??? State模式中,我们用类来表示状态.以类来表示状态后,我们就能通过切换类来方便地改变对象的状态.当需要增加新的状态时,如何修改代码这个问题也会很明确. 直接用状态代替硬编码 依赖于 ...
- 设计模式(十九)State模式
在面向对象编程中,是用类表示对象的.也就是说,程序的设计者需要考虑用类来表示什么东西.类对应的东西可能存在于真实世界中,也可能不存在于真实世界中.对于后者,可能有人看到代码后会感到吃惊:这些东西居然也 ...
- 《图解设计模式》读书笔记8-3 STATE模式
目录 State模式 示例程序 实现的功能 不使用&使用状态模式对比 示例程序的类图 代码 角色和类图 角色 类图 拓展思路 分而治之 依赖于状态的处理 谁来管理状态迁移 易于增加新状态 实例 ...
- 敏捷软件开发(1)--- STATE 模式
如果状态在运行过程中,不停的切换和改变,我们怎么办? 状态的迁移是我们生活和工程中非常普遍的一个概念.于是在数学上有一种理论来分析和解决这个问题. 有限状态机理论是一个非常成熟的理论,所有动作和流程的 ...
- State模式的经典应用场景:订单处理(c#实现)
State模式在对象内部状态发生变化的时候,改变自身的行为,这通常是通过切换内部状态对象实现的,对象将自身在各个状态的行为推给了状态对象,从而解开了行为与对象的依赖. 场景描述 在经典的订单处理场景中 ...
- 无聊之作,RPGdemo制作(一)角色state模式
今天周末,在家无事可做,不知道为什么,突发奇想,想写一个RPG游戏的demo玩玩.所以就记录一下. 第一步要做的是,为以后的角色类写一个state模式的类,考虑到可能以后会用到,所以用模版来实现, / ...
- State模式
地铁十字转门 状态迁移表格. 起始状态 触发迁移的事件 终止状态 要执行的动作. Locked Coin UnLocked UnLock UnLocked Pass ...
- Java从设计模式[本场比赛状态转换武器]状态分析(State)模式
如果我们正在做一个实时战略游戏.我们设计了一个武器,他制作只是当步兵,但他能够切换武器.第一个开关会变成弓箭手,第二个开关导通控股装甲盾牌,第三开关变成步兵--如何实现这一目标切换机构?我们开始思考, ...
随机推荐
- quartus ii13.0~16.0 调用uedit (转载http://blog.sina.com.cn/s/blog_6d5560f00102vax6.html)
转自 http://blog.sina.com.cn/s/blog_6d5560f00102vax6.html Quartus II 中的文本编辑软件不好用,比较习惯与UE(Uedit32/ultra ...
- 最长子串 FZU2118
http://acm.fzu.edu.cn/problem.php?pid=2128 分析:利用strstr()函数将每个字串在原串中的首尾位置存储一下,再将首尾从小到大排一下序.(写着写着就感觉和看 ...
- [刘阳Java]_Java技术有哪些学习重点_第1讲
纵观网上有很多非常好的对Java技术的总结,这里我个人谈谈对Java技术学习有哪些重点内容[浮浅之见] Java环境搭建 Java基础语法 Java面向对象编程 Java异常 Java IO流 Jav ...
- golang使用interface来mock进行测试(来自dotGO2014)
源自于dotGO 2014的视频,讲述如何使用 interface 来mock 进行测试.. 可以FQ的同学自己观看,这里把重要的一些代码给截图搬到国内了 https://www.youtube.co ...
- andorid 远程存储中JDK和Volley的GET和POST方法
在操作Volley的时候先添加volley.jar(包) <uses-permission android:name="android.permission.INTERNET" ...
- iOS键盘出现时界面跟着往上推
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyBoardWillShow:) name:UI ...
- memalign vs malloc - 使用O_DIRECT参数open一个文件并读写
听说使用odirect参数打开文件时能够以扇区的单位进行读写. 于是open了一个块设备文件/dev/sdo,当然还要带上读写参数O_RDWR 然后进行读写时出错了. 找了一会发现问题根本在于读写的b ...
- load-on-startup在web.xml中的含义
在servlet的配置当中,<load-on-startup>1</load-on-startup>的含义是: 标记容器是否在启动的时候就加载这个servlet. 当值为0或者 ...
- linux下如何开启oracle服务和开启监听
su - oracle 切换到oracle用户模式下 sqlplus /nolog //登录sqlplus SQL> connect /as sysdba //连接oracle SQL&g ...
- js注意
使用集成函数注意返回值,有的不会改变现有对象,仅返回对象的副本,而有的会改变现有对象并返回该对象. 变量名不能和函数名相同,否则会被覆盖. 查询时看清楚返回的是单个元素还是集合,如果是使用返回集合的方 ...