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)模式
如果我们正在做一个实时战略游戏.我们设计了一个武器,他制作只是当步兵,但他能够切换武器.第一个开关会变成弓箭手,第二个开关导通控股装甲盾牌,第三开关变成步兵--如何实现这一目标切换机构?我们开始思考, ...
随机推荐
- 使用Debussy+ModelSim快速查看前仿真波形
sim.do文件 quit -sim set PATH1 D:/Program/modelsim/vivado_lib set PATH2 D:/Program/Vivado/Vivado/2014. ...
- Spring 4 官方文档学习(十二)View技术
关键词:view technology.template.template engine.markup.内容较多,按需查用即可. 介绍 Thymeleaf Groovy Markup Template ...
- live555 直播arm-linux视频
live555例程testOnDemandRTSPServer.cpp启动一个流服务器 首先启动使用环境, TaskScheduler* scheduler = BasicTaskScheduler: ...
- mybatis mapper.xml 配置文件问题(有的错误xml是不报的) 导致服务无法启动 。
转载自 开源编程 一舟mybatsi xml编译报错,tomcat启动一直循环,导致内存溢出,启动失败 mapper.xml怎么知道有没有编译错误,哪个位置有错误 这应该是mybatis的一个bug, ...
- 关于checkbox与文字混排无法对齐的解决方法
先前代码如下 <span style="vertical-align:middle"><input type="checkbox" name ...
- Windows通用应用开发手记-Behavior SDK概述
随着Visual Studio 2013的发布,New Behavior SDK也一起出现了.和Expression Blend SDK相似,包括各种内置行为(behavior和action),可以用 ...
- DBHelp数据处理类
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 【转】JavaScript中,{}+{}等于多少?
原文链接:http://www.2ality.com/2012/01/object-plus-object.html 译文链接:http://www.cnblogs.com/ziyunfei/arch ...
- java最全的验证类封装
package com.tongrong.utils; import java.util.Collection; import java.util.Map; import java.util.rege ...
- python基础整理笔记(四)
一. python 打开文件的方法 1. python中使用open函数打开文件,需要设定的参数包括文件的路径和打开的模式.示例如下: f = open('a.txt', 'r+') 2. f为打开文 ...