GOF23(3)之建造者模式(创建型模式)

1、场景

       我们需要建造一个比较复杂的产品,如神舟飞船。这个产品创建起来非常的复杂,它肯定是由很多的零件先组成组件,然后组件再组成产品的,那么就会涉及到组件组装的顺序问题。

       实际开发中,我们所需要的对象创建时,非常的复杂,有很多的步骤需要处理的时候。

 

2、建造者模式的本质

       分离了对象子组件的单独构造(由Builder来负责)和装配(由Director负责)。从而可以构造出复杂的对象,这个模式适用于:某个对象的构建过程复杂的情况下使用。

       由于实现了构建和装配的解耦。不同的构建器,相同的装配,也可以做出不同的对象。相同的构建器,相同的装配顺序也可以做出不同的对象。也就是实现了构建算法和装配算法的解耦,实现了更好的复用。

 

3、代码实现

我们还是以Car为例,使用建造者模式来构建一辆Car。Car主要由三个组件组成:发动机、轮胎和座椅。

3.1 创建组件类

3.1.1 发动机

package com.zdw.builder;

public class Engine {
    private String name;

    public Engine(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

3.1.2 轮胎

package com.zdw.builder;

public class Tyre {
    private String name;

    public Tyre(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

3.1.3 座椅类

package com.zdw.builder;

public class Seat {
    private String name;

    public Seat(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

 

3.2 创建Car类

package com.zdw.builder;

public class Car {
    private Engine engine;
    private Seat seat;
    private Tyre tyre;

    public Seat getSeat() {
        return seat;
    }

    public void setSeat(Seat seat) {
        this.seat = seat;
    }

    public Tyre getTyre() {
        return tyre;
    }

    public void setTyre(Tyre tyre) {
        this.tyre = tyre;
    }

    public Engine getEngine() {
        return engine;
    }

    public void setEngine(Engine engine) {
        this.engine = engine;
    }

    //车子的功能方法
    public void run(){
        System.out.println("我的发动机是:"+engine.getName()+"==我的轮胎是:"+tyre.getName()+"==我的座椅是:"+seat.getName());
        System.out.println("我是一辆跑的好快的车子奥啊啊啊");
    }
}

 

3.3 创建Builder接口和实现类

3.3.1 ICarBuilder接口

package com.zdw.builder;

public interface ICarBuilder {
    Engine builderEngine();
    Seat BuilderSeat();
    Tyre createTyre();
}

3.3.2 CarBuilderImpl实现类

package com.zdw.builder;

public class CarBuilderImpl implements ICarBuilder {
    @Override
    public Engine builderEngine() {
        return new Engine("永久牌发动机");
    }

    @Override
    public Seat BuilderSeat() {
        return new Seat("德利座椅");
    }

    @Override
    public Tyre createTyre() {
        return new Tyre("米其林轮胎");
    }
}

3.4 创建Director的接口和实现类

3.4.1 ICarDirector接口

package com.zdw.builder;

public interface ICarDirector {

    Car directorCar();//组装车子的方法
}

3.4.2 CarDirectorImpl实现类

package com.zdw.builder;

public class CarDirectorImpl implements ICarDirector {
    private ICarBuilder carBuilder;

    public CarDirectorImpl(ICarBuilder carBuilder) {
        this.carBuilder = carBuilder;
    }

    @Override
    public Car directorCar() {
        Engine engine = carBuilder.builderEngine();
        Seat seat = carBuilder.BuilderSeat();
        Tyre tyre = carBuilder.createTyre();

        Car car = new Car();
        car.setEngine(engine);
        car.setSeat(seat);
        car.setTyre(tyre);
        return car;
    }
}

 

3.5 测试

package com.zdw.builder;

public class TestBuilder {
    public static void main(String[] args) {
        ICarDirector carDirector = new CarDirectorImpl(new CarBuilderImpl());
        Car car = carDirector.directorCar();
        car.run();
    }
}

3.6 应用场景

StringBuilder的append()方法;

SQL中PreparedStatement对象;

JDOM中的DomBuilder,SAXBuilder对象。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章