创建者模式

模式定义

将一个复杂对象的构建与它的表示分离,使得相同的构建过程可以创建不同的表示。

模式结构

模式结构

Builder:生成器接口,定义创建一个Product对象所需的各个部件的操作。
ConcreteBuilder:具体的生成器实现,实现各个部件的创建,并负责组装Product对象的各个部件,同时还提供一个让用户获取组装完成后的产品对象的方法。
Director:指导者,主要用来使用Builder接口,以一个统一的过程来构建所需要的Product对象。
Product:产品,表示被生成器构建的复杂对象,包含多个部件。

代码实现

@Data
public class AirShip {
    
    private OrbitalModule orbitalModule;  //轨道舱
    private Engine engine; //发动机

    public void launch(){
        System.out.println("发射!");
    }
}
@Data
@AllArgsConstructor
class OrbitalModule{
    private String name;
}
@Data
@AllArgsConstructor
class Engine {
    private String name;
}


public interface AirShipBuilder {
    Engine builderEngine();
    OrbitalModule builderOrbitalModule();
}

public class SxtAirShipBuilder implements AirShipBuilder {
    //StringBuilder, 以后学习XML解析中,JDOM库中的类:DomBuilder,SaxBuilder
    public Engine builderEngine() {
        System.out.println("构建发动机!");
        return new Engine("发动机!");
    }

    public OrbitalModule builderOrbitalModule() {
        System.out.println("构建轨道舱");
        return new OrbitalModule("轨道舱");
    }   
}


public interface AirShipDirector {
    /**
     * 组装飞船对象
     * @return
     */
    AirShip   directAirShip();
}

public class SxtAirshipDirector implements AirShipDirector {
    private AirShipBuilder builder;
    public SxtAirshipDirector(AirShipBuilder builder) {
        this.builder = builder;
    }
    public AirShip directAirShip() {
        Engine e = builder.builderEngine();
        OrbitalModule o = builder.builderOrbitalModule();

        //装配成飞船对象
        AirShip ship = new AirShip();
        ship.setEngine(e);
        ship.setOrbitalModule(o);
        
        return ship;
    }
}


public class Client {
    public static void main(String[] args) {
        AirShipDirector director = new SxtAirshipDirector(new SxtAirShipBuilder());
        AirShip ship = director.directAirShip();
        System.out.println(ship.getEngine().getName());
        ship.launch();
        
    }
}

模式的优缺点

优点

  1. 松散耦合
    产品构建和产品表现分离。

  2. 可以很容易地改变产品的内部表示
    要想改变产品的内部表示,只需要切换Builder的具体实现即可,不用管Director,因此变得容易。

  3. 更好的复用性
    构建算法可以复用,具体产品的实现也可以复用。

缺点

  1. 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。

  2. 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。

思考

模式本质:分离整体构建算法和部件构造。

开发中的应用场景

  1. 如果构讲对象的算法,应该独立于该对象的组成部分以及它们的装配方式时。

  2. 如果同一个构建过程有着不同的表示时。

构建的过程是同一的,不变的,变化的部分放到生成器部分

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容