类和实例

  • 对于大多数的类,都可以创建多个实例.在需要和不需要时,创建和删除这些实例.该过程会伴随着内存的分配和归还.
  • 同时,有一些类,应该仅有一个实例.该实例在程序启动/结束时被创建和删除.
    • 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模式的更多相关文章

  1. Java设计模式(19)状态模式(State模式)

    State的定义:不同的状态,不同的行为:或者说,每个状态有着相应的行为. 何时使用状态模式 State模式在实际使用中比较多,适合"状态的切换".因为我们经常会使用If else ...

  2. Behavioral模式State模式

    1.意向 同意一个目标,然后改变其内部状态,改变它的行为. 对象似乎改变它的类别. 2.别名 状态对象(Objects for States) 3.动机 考虑一个表示网络连接的类TCPConnecti ...

  3. State模式(状态设计模式)

    State??? State模式中,我们用类来表示状态.以类来表示状态后,我们就能通过切换类来方便地改变对象的状态.当需要增加新的状态时,如何修改代码这个问题也会很明确. 直接用状态代替硬编码 依赖于 ...

  4. 设计模式(十九)State模式

    在面向对象编程中,是用类表示对象的.也就是说,程序的设计者需要考虑用类来表示什么东西.类对应的东西可能存在于真实世界中,也可能不存在于真实世界中.对于后者,可能有人看到代码后会感到吃惊:这些东西居然也 ...

  5. 《图解设计模式》读书笔记8-3 STATE模式

    目录 State模式 示例程序 实现的功能 不使用&使用状态模式对比 示例程序的类图 代码 角色和类图 角色 类图 拓展思路 分而治之 依赖于状态的处理 谁来管理状态迁移 易于增加新状态 实例 ...

  6. 敏捷软件开发(1)--- STATE 模式

    如果状态在运行过程中,不停的切换和改变,我们怎么办? 状态的迁移是我们生活和工程中非常普遍的一个概念.于是在数学上有一种理论来分析和解决这个问题. 有限状态机理论是一个非常成熟的理论,所有动作和流程的 ...

  7. State模式的经典应用场景:订单处理(c#实现)

    State模式在对象内部状态发生变化的时候,改变自身的行为,这通常是通过切换内部状态对象实现的,对象将自身在各个状态的行为推给了状态对象,从而解开了行为与对象的依赖. 场景描述 在经典的订单处理场景中 ...

  8. 无聊之作,RPGdemo制作(一)角色state模式

    今天周末,在家无事可做,不知道为什么,突发奇想,想写一个RPG游戏的demo玩玩.所以就记录一下. 第一步要做的是,为以后的角色类写一个state模式的类,考虑到可能以后会用到,所以用模版来实现, / ...

  9. State模式

    地铁十字转门 状态迁移表格. 起始状态 触发迁移的事件 终止状态  要执行的动作. Locked   Coin               UnLocked UnLock UnLocked Pass  ...

  10. Java从设计模式[本场比赛状态转换武器]状态分析(State)模式

    如果我们正在做一个实时战略游戏.我们设计了一个武器,他制作只是当步兵,但他能够切换武器.第一个开关会变成弓箭手,第二个开关导通控股装甲盾牌,第三开关变成步兵--如何实现这一目标切换机构?我们开始思考, ...

随机推荐

  1. DataGridView 控件详细解说

    1. DataGridView 控件详细解说:http://blog.csdn.net/qq_24304137/article/details/51068768 2. DataGridView的几个基 ...

  2. 如何启动另一个Activity

    --------siwuxie95 首先为res->layout下my_layout.xml 的Design添加一个Button,进入Text, android:text 修改为:启动另一个Ac ...

  3. [转]Linux vi 编辑后如何保存

    比如:vi /etc/vsftpd/vsftpd.conf 按ESC键 跳到命令模式,然后: :w 保存文件但不退出vi :w file 将修改另外保存到file中,不退出vi :w! 强制保存,不推 ...

  4. Android Studio 初使用

    Android Studio 更改Eclipse快捷键 Android Studio 更改编码 Android Studio 导包

  5. MapReduce --全排序

    MapReduce全排序的方法1: 每个map任务对自己的输入数据进行排序,但是无法做到全局排序,需要将数据传递到reduce,然后通过reduce进行一次总的排序,但是这样做的要求是只能有一个red ...

  6. Java语言环境(JDK的安装教学)

    //此文档由徐浩军编写(32/64位系统都适用) 1.下载JDK安装包你 2.点击安装包开始安装 3.首先你要选择安装地址一般情况下,都会选择默认地址. (请记住这个地址,之后配置环境变量的时候需要用 ...

  7. Oracle 包(Package)

    引用这位大大的: http://www.cnblogs.com/lovemoon714/archive/2012/02/29/2373695.html 1.为什么要使用包?       答:在一个大型 ...

  8. B. Factory Repairs--cf627B(线段树)

    http://codeforces.com/problemset/problem/627/B 题目大意:  n代表天数 ,k代表每一次维修持续的天数,a代表维修过后每天能生产a件产品,b代表维修之前每 ...

  9. Js之Dom学习-三种获取页面元素的方式、事件、innerText和innerHTML的异同

    一.三种获取页面元素的方式: getElementById:通过id来获取 <body> <input type="text" value="请输入一个 ...

  10. Linux 修改IP地址

    vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE="eth0" BOOTPROTO="static" #静 ...