zoukankan      html  css  js  c++  java
  • 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)]

  • 相关阅读:
    通讯录封装实现
    简单通讯录的实现 main..h .m文件全部
    iOS 开发 OC编程 字典和集合 排序方法
    iOS 开发 OC编程 数组冒泡排序.图书管理
    iOS 开发 OC编程 属性和字符串练习
    iOS 开发 OC编程 属性和字符串
    iOS 开发 OC编程 便利构造器以及初始化方法
    iOS 开发 OC编程 方法的书写
    IOS 开发 OC编程 类和对象
    iOS 开发 c语言阶段考试题
  • 原文地址:https://www.cnblogs.com/robyn/p/3467283.html
Copyright © 2011-2022 走看看