建造者模式

2019-08-01  本文已影响0人  闽越布衣

描述

    建造模式是对象的创建模式。建造模式可以将一个产品的内部表象与产品的生产过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。

简介

建造者类图

    建造者模式是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

    一个产品常有不同的组成成分作为产品的零件,这些零件有可能是对象,也有可能不是对象,它们通常又叫做产品的内部表象(internal representation)。不同的产品可以有不同的内部表象,也就是不同的零件。使用建造模式可以使客户端不需要知道所生成的产品有哪些零件,每个产品的对应零件彼此有何不同,是怎么建造出来的,以及怎么组成产品。

角色

优缺点

优点

缺点

使用场景

示例

   我们用制造自行车为例子讲解建造者模式,自行车由车架、轮胎、脚踏等部件组成。自行车制造公司就是把这些零部件组装起来。自行车制造公司的工程部门相当于指挥者,生产部门相当于建造者,当今共享单车做的比较大的摩拜和ofo相当于客户,单车就是产品了。

/**
* 产品(Product)角色
* 单车产品
*/
public class Bike {
    /**
     * 轮胎
     */
    private String tyre;
    /**
     * 车架
     */
    private String frame;

    /**
     * GPS定位装置
     */
    private String gps;

    public String getTyre() {
        return tyre;
    }

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

    public String getFrame() {
        return frame;
    }

    public void setFrame(String frame) {
        this.frame = frame;
    }

    public String getGps() {
        return gps;
    }

    public void setGps(String gps) {
        this.gps = gps;
    }

    @Override
    public String toString() {
        return "Bike{" +
               "tyre='" + tyre + '\'' +
                ", frame='" + frame + '\'' +
                ", gps='" + gps + '\'' +
                '}';
    }
}
/**
* 抽象建造者(Builder)角色
* 自行车生产线接口
*/
public interface BikeBuilder {
    /**
     * 组装轮胎
     */
    void buildTyres();

    /**
     * 组装车架
     */
    void buildFrame();

    /**
     * 组装GPS定位装置
     */
    void buildGPS();

    /**
     * 获取自行车
     */
    Bike getBike();
}
/**
* 具体建造者(ConcreteBuilder)角色
* 摩拜单车
*/
public class MoBikeBuilder implements BikeBuilder {
    /**
     * 单车对象
     */
    private Bike bike;

    public MoBikeBuilder(Bike bike) {
        this.bike = bike;
    }

    @Override
    public void buildTyres() {
        bike.setTyre("橙色轮胎");
    }

    @Override
    public void buildFrame() {
        bike.setFrame("橙色车架");
    }

    @Override
    public void buildGPS() {
        bike.setGps("mobike定制版GPS定位装置");
    }

    @Override
    public Bike getBike() {
        return bike;
    }
}
/**
* 具体建造者(ConcreteBuilder)角色
* OfO单车
*/
public class OfoBikeBuilder implements BikeBuilder {
    /**
     * 单车对象
     */
    private Bike bike;

    @Override
    public void buildTyres() {
        bike.setTyre("黑色轮胎");
    }

    @Override
    public void buildFrame() {
        bike.setFrame("黄色车架");
    }

    @Override
    public void buildGPS() {
        bike.setGps("ofo定制版GPS定位装置");
    }

    @Override
    public Bike getBike() {
        return bike;
    }
}
/**
* 导演者(Director)角色
* 指导组装单车
*/
public class EngineeringDepartment {
    private BikeBuilder bikeBuilder;

    /**
     * 用户告知指挥者想要什么样的单车
     *
     * @param bikeBuilder
     */
    public EngineeringDepartment(BikeBuilder bikeBuilder) {
        this.bikeBuilder = bikeBuilder;
    }

    /**
     * 指导组装单车
     */
    public void construct() {
        bikeBuilder.buildTyres();
        bikeBuilder.buildFrame();
        bikeBuilder.buildGPS();
    }
}
/**
* 测试类
*/
public class BuilderTest {
    public static void main(String[] args) {
        Bike bike = new Bike();
        /**
         * 创建摩拜单车
         */
        BikeBuilder bikeBuilder = new MoBikeBuilder(bike);
        EngineeringDepartment engineeringDepartment = new EngineeringDepartment(bikeBuilder);
        /**
         * 指导组装单车
         */
        engineeringDepartment.construct();
        System.out.println(bike.toString());
    }
}
上一篇 下一篇

猜你喜欢

热点阅读