设计模式——建造者模式

118 阅读3分钟

引言

网上有很多介绍设计模式系列的优秀文章,看懂不一定是真懂,能写出来,说出个1、2、3点才算是真的懂了,如果能灵活的应用到工作中才算是真的熟练。

1、模式场景

汽车的构造是复杂的,整车包括车架、车轮、发动机等。消费者无需关心汽车的构造细节,只需告诉厂商想要奔驰还是宝马,提车的时候,就可以提取相应的车。

2、模式结构

1、Builder:抽象建造者 定义构造的类型和流程,对应模式场景中车的组装过程。 2、ConcreteBuilder:具体建造者 定义具体构造流程的实现,对应模式场景中奔驰车、宝马车组装过程。 3、Director:指挥者 定义选择哪个构造流程实现,对应模式场景中生产厂商。 4、Product:产品角色 定义是何种产品,对应模式场景中的车。

3、示例代码

3.1、抽象建造者

public abstract class CarBuild {
    public Car car;
    //建造车轮
    public CarBuild buildWheel(){
        return this;
    }
    //建造引擎
    public CarBuild buildEngine(){
        return this;
    }
    //建造车架
    public CarBuild buildFrame(){
        return this;
    }
    public Car getCar() {
        return car;
    }
    public void setCar(Car car) {
        this.car = car;
    }
}

3.2、具体建造者

//宝马车建造者
public class BmwCarBuild extends CarBuild {

    public BmwCarBuild(){
        this.car = new Car();
    }
    @Override
    public CarBuild buildWheel() {
        car.setWheel("Bmw wheel ...");
        return this;
    }
    @Override
    public CarBuild buildEngine() {
        car.setEngine("Bmw engine ...");
        return this;
    }
    @Override
    public CarBuild buildFrame() {
        car.setFrame("Bmw frame ...");
        return this;
    }
}
//奔驰车建造者
public class BenzCarBuild extends CarBuild {

    public BenzCarBuild(){
        this.car = new Car();
    }
    @Override
    public CarBuild buildWheel() {
        car.setWheel("Benz wheel ...");
        return this;
    }
    @Override
    public CarBuild buildEngine() {
        car.setEngine("Benz engine ...");
        return this;
    }
    @Override
    public CarBuild buildFrame() {
        car.setFrame("Benz frame ...");
        return this;
    }
}

3.3、指挥者

public class CarFactory {
    private Car car;

    public CarFactory(CarBuild carBuild) {
        Car car = carBuild.buildWheel().buildEngine().buildFrame().getCar();
        this.car = car;
    }

    public Car getCar() {
        return car;
    }
}

3.4、产品角色

public class Car {
    //车轮
    private String wheel;
    //引擎
    private String engine;
    //车架
    private String frame;

    public String getWheel() {
        return wheel;
    }
    public void setWheel(String wheel) {
        this.wheel = wheel;
    }

    public String getEngine() {
        return engine;
    }
    public void setEngine(String engine) {
        this.engine = engine;
    }
    public String getFrame() {
        return frame;
    }
    public void setFrame(String frame) {
        this.frame = frame;
    }

    @Override
    public String toString() {
        return "Car{" +
                "wheel='" + wheel + '\'' +
                ", engine='" + engine + '\'' +
                ", frame='" + frame + '\'' +
                '}';
    }
}

3.5、测试类

public class CarTest {

    public static void main(String[] args) {
        //构建一辆奔驰车
        CarFactory benzFactory = new CarFactory(new BenzCarBuild());
        Car benzCard = benzFactory.getCar();
        System.out.println(benzCard.toString());
        //构建一辆宝马车
        CarFactory bmwFactory = new CarFactory(new BmwCarBuild());
        Car bmwCard = bmwFactory.getCar();
        System.out.println(bmwCard.toString());
    }
}

控制台输出:

Car{wheel='Benz wheel ...', engine='Benz engine ...', frame='Benz frame ...'}
Car{wheel='Bmw wheel ...', engine='Bmw engine ...', frame='Bmw frame ...'}

4、模式优点

  • 客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。
  • 可以更加精细地控制产品的创建过程。
  • 用户使用不同的建造者得到不同的对象,系统的扩展也方便。

5、模式缺点

  • 有局限性,适用产品组成部分相似的,如果差异性很大则不适用。

结束语

建造者模式在很多游戏领域都有用到,玩游戏时候,根据不同关卡,会渲染不同地图,而地图的创建过程是固定的,使用建造者模式就非常合适。下一篇:设计模式——单例模式