三分钟带您搞懂建造者模式

定义:

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

理解:

  建造者模式有两重含义:
  1 将一个对象的使用和创建过程分离,这样用户在使用这个对象的时候,就不需要关心该对象的具体创建过程和细节。
  2 将对象创建的步骤抽象出来,再创建其他创建步骤相同的对象时,只需要依赖这个抽象(前提是这个对象的建造顺序是稳定的)

图示:

  通过上图可以看出,建造者模式中的角色有4类:
   Director:指挥者,与客户端进行沟通,封装对象创建过程
   Builder:创建对象各个步骤的抽象
   ConcreteBuilder:实现抽象,进行具体的操作
   Product:被创建的对象

实例:

  这里举一个生产共享单车的例子,我们通过建造者模式,创建膜拜和ofo两种单车。
这里单车就是Product,两种不同种类的单车对应着ConreteBuilder,生产单车的步骤被抽象到了Builder中。 Director负责与客户端进行交互,封装单车的生产过程。

/**
 * 单车.
 *
 * @author jialin.li
 * @date 2019-12-30 15:37
 */
public class Bike {
    private String tire;
    private String paint;
    private String theme;

    public void setTire(String tire) {
        this.tire = tire;
    }

    public void setPaint(String paint) {
        this.paint = paint;
    }

    public void setTheme(String theme) {
        this.theme = theme;
    }

    @Override
    public String toString() {
        return "Bike{" +
                "tire='" + tire + '\'' +
                ", paint='" + paint + '\'' +
                ", theme='" + theme + '\'' +
                '}';
    }
}
/**
 * 建造者,生产单车步骤的抽象(胡乱写的步骤...).
 *
 * @author jialin.li
 * @date 2019-12-30 15:29
 */
public interface Builder{
    /** 安装轮胎 */
    void installTire();
    /** 喷漆 */
    void sprayPaint();
    /** 联网 */
    void theme();
    /** 获得产品 */
    Bike getProduct();
}
/**
 * 指挥者.
 *
 * @author jialin.li
 * @date 2019-12-30 15:44
 */
public class Director {
    public static Bike builder(Builder builder){
        builder.installTire();
        builder.sprayPaint();
        builder.theme();
        return builder.getProduct();
    }
}
/**
 * 膜拜单车
 *
 * @author jialin.li
 * @date 2019-12-30 15:35
 */
public class MobikeBuilder implements Builder{

    private Bike bike;

    public MobikeBuilder() {
        this.bike = new Bike();
    }

    @Override
    public void installTire() {
        bike.setTire("山地胎");
    }

    @Override
    public void sprayPaint() {
        bike.setPaint("橘色喷漆");
    }

    @Override
    public void theme() {
        bike.setTheme("摩拜单车");
    }

    @Override
    public Bike getProduct() {
        return bike;
    }
}
/**
 * ofo单车
 *
 * @author jialin.li
 * @date 2019-12-30 15:44
 */
public class OfoBuilder implements Builder{

    private Bike bike;

    public OfoBuilder() {
        this.bike = new Bike();
    }

    @Override
    public void installTire() {
        bike.setTire("防滑胎");
    }

    @Override
    public void sprayPaint() {
        bike.setPaint("黄色喷漆");
    }

    @Override
    public void theme() {
        bike.setTheme("OFO");
    }

    @Override
    public Bike getProduct() {
        return bike;
    }
}
/**
 * 客户端.
 *
 * @author jialin.li
 * @date 2019-12-30 15:50
 */
public class Main {
    public static void main(String[] args) {
        Builder mobikeBuilder = new MobikeBuilder();
        Builder ofoBuilder = new OfoBuilder();

        Bike mobike = Director.builder(mobikeBuilder);
        System.out.println(mobike.toString());

        Bike ofo = Director.builder(ofoBuilder);
        System.out.println(ofo.toString());
    }
}

结果:

Bike{tire='山地胎', paint='橘色喷漆', theme='摩拜单车'}
Bike{tire='防滑胎', paint='黄色喷漆', theme='OFO'}

  期待您的关注、推荐、收藏,同时也期待您的纠错和批评。

猜你喜欢

转载自www.cnblogs.com/nedulee/p/12120215.html