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)]

时间: 2025-01-31 09:22:23

Singleton模式和Mono-State模式的相关文章

Java状态模式(State模式)

State的定义:不同的状态,不同的行为:或者说,每个状态有着相应的行为. 何时使用状态模式 State模式在实际使用中比较多,适合"状态的切换".因为我们经常会使用If elseif else 进行状态切换, 如果针对状态的这样判断切换反复出现,我们就要联想到是否可以采取State模式了. 不只是根据状态,也有根据属性.如果某个对象的属性不同,对象的行为就不一样,这点在数据库系统中出现频率比较高,我们经常会在一个数据表的尾部,加上property属性含义的字段,用以标识记录中一些特殊

State模式详解--设计模式(14)

State模式来源:         每个人.事物在不同的状态下会有不同表现(动作),而一个状态又会在不同的表现下转移到下一个不同的状态(State).最简单的一个生活中的例子就是:地铁入口处,如果你放入正确的地铁票,门就会打开让你通过.在出口处也是验票,如果正确你就可以ok,否则就不让你通过(如果你动作野蛮,或许会有报警(Alarm)). 有限状态自动机(FSM)也是一个典型的状态不同,对输入有不同的响应(状态转移).通常我们在实现这类系统会使用到很多的Switch/Case语句,Case某种

Behavioral模式State模式

1.意向 同意一个目标,然后改变其内部状态,改变它的行为. 对象似乎改变它的类别. 2.别名 状态对象(Objects for States) 3.动机 考虑一个表示网络连接的类TCPConnection.一个TCPConnection对象的状态处于若干不同状态之中的一个:连接已建立(Established).正在监听(Listenling).连接已关闭(Closed).当一个TCPConnection对象收到其它对象的请求时.它依据自身的当前状态做出不同的反应.比如,一个Open请求的结果依赖

Behavioral模式之State模式

1.意图 允许一个对象再其内部状态改变时,改变它的行为.对象看起来似乎修改了它的类. 2.别名 状态对象(Objects for States) 3.动机 考虑一个表示网络连接的类TCPConnection.一个TCPConnection对象的状态处于若干不同状态之一:连接已建立(Established).正在监听(Listenling),连接已关闭(Closed).当一个TCPConnection对象收到其他对象的请求时,它根据自身的当前状态做出不同的反应.例如,一个Open请求的结果依赖于该

State模式(状态设计模式)

State??? State模式中,我们用类来表示状态.以类来表示状态后,我们就能通过切换类来方便地改变对象的状态.当需要增加新的状态时,如何修改代码这个问题也会很明确. 直接用状态代替硬编码 依赖于状态的处理,来执行具体的操作 理清职责 实现功能: ·有一个金库 ·金库与警报中心相连 ·金库里有警铃和正常通话用的电话·金库里有时钟,监视着现在的时间 ·白天的时间范围是9:00~16:59,晚上的时间范围是17:00~23:59和0:00~8:59 ·金库只能在白天使用 ·白天使用金库的话,会在

有限状态自动机FSM实现(二)--State模式

基于switch结构的有限状态自动机的实现已经在前一篇博文中给出,请猛击. State模式适用于如下情况: 1)一个对象的行为取决于它的状态,并且必须在运行时根据状态改变它的行为. 2)一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态. State模式包含如下对象: Context对象 1)定义客户感兴趣的接口. 2)维护一个State子类的实例,这个实例定义当前状态. State状态对象 定义一个接口封装与Context的一个特定状态相关的行为. 以下图为例:TCPConne

【行为型】State模式

状态模式其意图是在一个对象的状态发生变化时能够同时改变它的行为.一个生活中比较常见的例子就如你(是指你自己本人)在走时时,整个人全身的动作是双手臂前后慢慢摇摆且双脚也是一步一步慢慢往前移的,即:该走路状态下,你所对应的是走路动作:在跑步时,你的双手双脚动作明显频率.步伐都加快,即:在跑步状态下,你所对应的是跑步动作:........:在睡着时,你的全身都是不动的,即:睡着状态下,你是处于睡觉的动作状态.在实际项目开发中,(该模式)最常见的框架设计便是FSM了.模式的类关系结构图参考如下: 编码结

Java 实现状态(State)模式

/** * @author stone */ public class WindowState { private String stateValue; public WindowState(String stateValue) { this.stateValue = stateValue; } public String getStateValue() { return stateValue; } public void setStateValue(String stateValue) { t

State 模式

State模式中我们将状态逻辑和动作实现进行分离.允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类:在一个状态即将结束的时候启用下一个状态. 1 /////////state.h///////////////////////////////////////////////////////////////// 2 #pragma once 3 class Context ; 4 class State 5 { 6 public: 7 virtual ~State(); 8 S

设计模式21:State 状态模式(行为型模式)

State 状态模式(行为型模式) 动机(Motivation) 在软件构建过程中,某些对象的状态如果改变,其行为也会随之而发生变化,比如文档处于只读状态,其支持的行为和读写状态的行为就可能完全不同. 如何在运行时根据对象的状态来透明地更改对象的行为?而不会为对象操作和状态转换之间引入紧耦合? 意图(Intent) 允许一个对象在其内部状态改变时改变它的行为.从而使对象看起来似乎修改了其行为.——<设计模式>GoF 结构(Structure) 示例代码 public enum Document