【读书笔记】设计模式3章:创建型模式

来源:互联网 发布:整人剃发软件 编辑:程序博客网 时间:2024/05/29 18:03
我参照书中的例程重新构想了一些更加生动、易于理解的例子,希望大家喜欢。
代码可以通过以下链接进行浏览:
http://git.oschina.net/caipeichao/java-design-pattern

创建型模式能封装对象的创建过程,能提供对象的创建和管理职责。

  • 单例模式
    • 定义
      • 确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例
      • 分为饿汉式和懒汉式(Lazy Initialize)
        • 懒汉式注意多线程同步(synchronize)
    • 优点
      • 减少内存开支(因为只有一个实例)
      • 减少系统性能开销(因为只创建一次)
      • 避免了资源的多重占用(比如日志文件)
      • 可以设置全局访问点
    • 缺点
      • 无法创建子类
      • 不便于测试(必须用mock方式进行测试,stub方式要自己写类,mock不需要)
      • 与单一职责原则有冲突
    • 使用场景
      • 生成唯一序列号
      • 整个项目需要一个共享访问点
      • 创建一个对象要消耗很多资源
      • 需要定义大量静态常量和静态方法
    • 注意事项
      • 单例分为有状态单例和无状态单例,如果是有状态单例,那么要注意分布式JVM下单例会出现多个实例,造成数据不同步,而无状态单例没有这个问题。在EJB RMI JINI中要注意这个问题
      • 如果一个JVM有多个ClassLoader,那么单例也会出现多个实例的情况,此时也要避免使用有状态单例
      • 单例不要实现clone方法,因为clone方法会造成多个实例
  • 工厂方法模式
    • 定义
      • 又叫虚拟构造函数
      • 工厂模式将实际的创建工作推迟到子类中
      • 分为简单工厂、工厂方法、抽象工厂
      • 工厂方法只针对一个产品,抽象工厂针对一系列产品
      • 角色:抽象工厂、具体工厂、抽象产品、具体产品
    • 优点
      • 良好的封装性,代码结构清晰
      • 优秀的可扩展性
      • 屏蔽产品类
      • 能解耦合
    • 使用场景
      • 是new的替代品,有new的地方都可以用工厂方法代替
      • 需要灵活的、可扩展的方式
      • 可以使用在异构项目中(一个项目中出现多种编程语言)
      • 工厂方法可以用在测试框架中(用于生成桩模块)
  • 抽象工厂模式
    • 定义
      • 其实就是在工厂方法模式中增加一个产品
      • 角色:抽象工厂、具体工厂、抽象产品、具体产品
    • 优点
      • 产品族内的约束对使用者而言是看不到的
      • 增加一个生产线非常容易
    • 缺点
      • 增加一个产品非常困难
    • 使用场景
      • 比如某个类需要在三个不同的平台上运行,可以通过抽象工厂屏蔽操作系统的细节
  • 建造者模式
    • 定义
      • 也叫做生成器模式
      • 将一个复杂对象的创建过程与它的表示分离,这样相同的构建过程可以创建不同的表示
      • 角色:抽象建造者、具体建造者、产品、导演者
    • 优点
      • 封装性
      • 建造者比较独立,便于扩展
      • 便于控制细节风险(建造过程可以逐步细化,而不影响其他模块)
    • 使用场景
      • 相同的方法,执行顺序不同,产生的结果也不同,可以用建造者模式
      • 多个零件装配到一个对象中
      • 产品类非常复杂
      • 对象创建过程使用到了系统中的其他对象
  • 原型模式
    • 定义
      • 根据现有对象复制一个新的对象
      • 角色:客户、抽象原型、具体原型
      • Java中的Clonable就是原型模式
    • 优点
      • 性能优良
      • 避免构造函数的约束
    • 使用场景
      • 资源优化场景
      • 性能和安全性场景

0 0