设计模式小抄(二) -- 建造者模式

建造者模式

建造者模式(builder)是创建一个复杂对象的创建型模式,将构建复杂对象的过程和它的部件解耦,使得构建过程和部件的表示分离开来。

UML结构

建造者模式角色:

  抽象建造者(Builder)角色:给出一个抽象接口,以规范产品对象的各个组成成分的建造。一般而言,此接口独立应用程序的商业逻辑。模式中直接创建产品对象的是具体建造者(ConcreteBuilder)角色。具体建造者类必须实现这个接口所要求的两种方法:一种是建造方法(buildPart1和buildPart2),另一种是返还结构方法(retrieveResult)。一般来说,产品所包含的零件数目与建造方法的数目相符。换言之,有多少 零件,就有多少相应的建造方法。

  具体建造者(ConcreteBuilder)角色:担任这个角色的是与应用程序紧密相关的一些类,它们在应用程序调用下创建产品的实例。这个角色要完成的任务包括:1.实现抽象建造者Builder所声明的接口,给出一步一步地完成创建产品实例的操作。2.在建造过程完成后,提供产品的实例。

  导演者(Director)角色:担任这个角色的类调用具体建造者角色以创建产品对象。应当指出的是,导演者角色并没有产品类的具体知识,真正拥有产品类的具体知识的是具体建造者角色。

  产品(Product)角色:产品便是建造中的复杂对象。一般来说,一个系统中会有多于一个的产品类,而且这些产品类并不一定有共同的接口,而完全可以是不相关联的。            

实例代码

目录结构:

Porsche

我们使用建造者模式, 创建一辆 保时捷(Porsche) 来溜达溜达,大体上一辆车主要有以下属性(简单列举了几个)

public class Porsche {
    //引擎
    private String engine;
    //气缸
    private String cylinder;
    //车架
    private String frame;

    // 省略 get/set method
}
复制代码

Builder

抽象Builder类, 列举我们在创建一辆车过程中,需要安装哪些部件


public abstract class Builder {
    public abstract void buildEngine(String engine);

    public abstract void buildCylinder(String cylinder);

    public abstract void buildFrame(String frame);

    public abstract Porsche create();
}

复制代码

PorscheBuilder

具体实现创建的方法,用于创建车辆

public class PorscheBuilder extends Builder {

    private Porsche porsche = new Porsche();


    public void buildEngine(String engine) {
        porsche.setEngine(engine);
    }

    public void buildCylinder(String cylinder) {
        porsche.setCylinder(cylinder);
    }

    public void buildFrame(String frame) {
        porsche.setFrame(frame);
    }

    public Porsche create() {
        return porsche;
    }
}
复制代码

Director

指挥官, 负责创建过程中的流程编排

public class Director {
    private Builder builder;

    public Director(Builder builder) {
        this.builder = builder;
    }

    public Porsche createPorsche(String engine, String cylinder, String frame) {
        builder.buildEngine(engine);
        builder.buildCylinder(cylinder);
        builder.buildFrame(frame);
        return builder.create();
    }
}
复制代码

客户端调用

class create {
    public static void main(String[] args) {
        Builder builder = new PorscheBuilder();
        Director director = new Director(builder);
        //组装车辆
        director.createPorsche("engine","cylinder","frame");
    }
}
复制代码

特性

使用场景

  • 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
  • 相同的方法,不同的执行顺序,产生不同的事件结果时。
  • 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时。
  • 产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能。
  • 创建一些复杂的对象时,这些对象的内部组成构件间的建造顺序是稳定的,但是对象的内部组成构件面临着复杂的变化。

优缺点

  • 优点: 使用建造者模式可以使客户端不必知道产品内部组成的细节。 具体的建造者类之间是相互独立的,容易扩展。 由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。
  • 缺点: 产生多余的Build对象以及Dirextor类。

参考:

哆啦A梦-传送门 哆啦A梦-传送门

猜你喜欢

转载自juejin.im/post/5cde16cff265da037418a388
今日推荐