《设计模式之禅》读书笔记-2.5-建造者模式

2.5 建造者模式

定义:

Builder Pattern,也叫生成器模式
Separate the construction of a complex object from its representation so that the same construction process can create different representations.
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示

优点:

  1. 封装性

客户端不用知道产品内部的组成细节,直接调用Director类得到具体产品

  1. 建造者独立,容易扩展
  2. 便于控制细节风险

使用场景:

  1. 相同的方法,不同的执行顺序,产生不同的事件结果时,可采用
  2. 多个部件或零件,都可以装配到一个对象中,但产生的运行结果不同时,可采用
  3. 产品非常复杂,或产品类中的调用顺序不同产生了不同的效能,可采用
  4. 在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品的创建过程中不易得到,可采用。

这个场景只能是一个补偿方法,因为一个对象不易获得,在设计阶段竟然没有发觉,而需要通过创建模式柔化创建过程,本身已经违反了设计的最初目标。

注意:

  1. 建造者模式关注的是零件的类型和装配工艺(顺序),这是它与工厂方法模式最大的不同,虽同为创建类模式,但侧重点不同。
  2. 与建造者模式相比,工厂方法模式侧重于创建,创建零件是它的主要职责,组装顺序不是它关心的
  3. 创建者模式中的零件[setPart()会安排零件顺序]:零件组装顺序不同对象效能也不同,实现效能的方法[如汽车组装后的运行方法run()]可引入模板方法模式
  4. 使用建造者模式的时候考虑下模板方法模式,不要孤立地思考一个模式。

代码:

/**
 * ❉    ❉    ❉    ❉    ❉    产品    ❉    ❉    ❉    ❉    ❉
 */
class Product{
    public void doSomething(){}
}

/*
 * 抽象建造者
 */
abstract class Builder{
    //设置产品的不同部分,以获得不同的产品
    public abstract void setPart();
    //建造产品
    public abstract Product buildProduct();
}

/**
 * ❉    ❉    ❉    ❉    ❉    具体建造者    ❉    ❉    ❉    ❉    ❉    
 */
class ConcreateBuilder extends Builder{
    private Product pro = new Product();
    
    //设置产品零件
    @Override
    public void setPart(){
        //处理Product
    }
    
    //组建产品
    @Override
    public Product buildProduct(){
        return pro;
    }
}

/**
 * ❉    ❉    ❉    ❉    ❉    导演    ❉    ❉    ❉    ❉    ❉
 *     
 * 起到封装作用,避免高层模块深入到建造者内部的实现类。
 * 建造者模式比较庞大时,导演类可以有多个
 */
class Dirctor{
    private ConcreateBuilder builder = new ConcreateBuilder();
    public Product getAProduct(){
        builder.setPart();//设置零件
        return builder.buildProduct();//生成产品
    }
}

你可能感兴趣的:(《设计模式之禅》读书笔记-2.5-建造者模式)