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對象。

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