设计模式-建造者模式

前言

  建造者模式属于创建型模式,他提供了一种创建对象的最佳方式
  定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
  主要作用:在用户不知道对象的建造过程和细节的情况下就可以直接按顺序创建复杂的对象(把内部的构造过程和细节隐藏起来),指需要知道结果不需要知道过程。

一、案例

例子:

  1. 工厂(建造者模式):负责制造汽车、电动车(组装过程和细节在工厂内)
  2. 汉堡:只需要点餐(制作过程不需要知道)

实例:购买一辆电动车

ElectromobileProduct

/**
 * @Author: Lanys
 * @Description:  材料
 * @Date: Create in 21:50 2021/8/5
 */
public class ElectromobileProduct {

    /**
     * 前轮
     */
    private String frontWheel;

    /**
     * 车身
     */
    private String bodyWork;

    /**
     * 后轮
     */
    private String rearWheel;

    public void setFrontWheel(String frontWheel) {
        this.frontWheel = frontWheel;
    }

    public void setBodyWork(String bodyWork) {
        this.bodyWork = bodyWork;
    }

    public void setRearWheel(String rearWheel) {
        this.rearWheel = rearWheel;
    }

    @Override
    public String toString() {
      return  "生产一辆电动车前轮["+frontWheel+"]、车身["+bodyWork+"]、后轮["+rearWheel+"]"
    }

Build

**
 * @Author: Lanys
 * @Description: 图纸
 * @Date: Create in 21:59 2021/8/5
 */
public abstract class Build {

    /**
     * 前轮
     */
    protected abstract void productionFrontWheel();

    /**
     * 车身
     */
     abstract void productionBodyWork();

    /**
     * 后轮
     */
     abstract void productionRearWheel();

    /**
     * 产品
     *
     */
    abstract ElectromobileProduct product();
}

Worker

/**
 * @Author: Lanys
 * @Description: 工人
 * @Date: Create in 22:00 2021/8/5
 */
public class Worker extends Build {

    private ElectromobileProduct electromobileProduct;

    public Worker(){
        this.electromobileProduct = new ElectromobileProduct();
    }

    /**
     * 前轮
     *
     */
    @Override
    public void productionFrontWheel() {
        electromobileProduct.setFrontWheel("前轮");
    }

    /**
     * 车身
     *
     */
    @Override
    public void productionBodyWork() {
        electromobileProduct.setBodyWork("车身");
    }

    /**
     * 后轮
     *
     */
    @Override
    public void productionRearWheel() {
        electromobileProduct.setRearWheel("后轮");
    }

    /**
     * 产品
     *
     */
    @Override
    public ElectromobileProduct product() {
       return electromobileProduct;
    }
}

Leader

/**
 * @Author: Lanys
 * @Description: 领导者
 * @Date: Create in 22:09 2021/8/5
 */


public class Leader {

    public ElectromobileProduct build(Build build){
        build.productionFrontWheel();
        build.productionBodyWork();
        build.productionRearWheel();

        return build.product();
    }
}

Test

/**
 * @Author: Lanys
 * @Description:
 * @Date: Create in 22:13 2021/8/5
 */


public class Test {
    public static void main(String[] args) {
        Leader leader = new Leader();

        ElectromobileProduct build = leader.build(new Worker());
        System.out.println(build.toString());
    }
}

在这里插入图片描述
电动车的零件是死的,如果我想把电动车改装成自己想要的,应该怎么做?

改装

ElectromobileProduct

/**
 * @Author: Lanys
 * @Description:  电动车材料
 * @Date: Create in 21:50 2021/8/5
 */
public class ElectromobileProduct {

    /**
     * 前轮
     */
    private String frontWheel = "奥迪前轮";

    /**
     * 车身
     */
    private String bodyWork = "地平线车身";

    /**
     * 后轮
     */
    private String rearWheel = "奔驰后轮";

    public ElectromobileProduct setFrontWheel(String frontWheel) {
        this.frontWheel = frontWheel;
        return this;
    }

    public ElectromobileProduct setBodyWork(String bodyWork) {
        this.bodyWork = bodyWork;
        return this;
    }

    public ElectromobileProduct setRearWheel(String rearWheel) {
        this.rearWheel = rearWheel;
        return this;
    }

    @Override
    public String toString() {
        return "ElectromobileProduct{" +
                "frontWheel='" + frontWheel + '\'' +
                ", bodyWork='" + bodyWork + '\'' +
                ", rearWheel='" + rearWheel + '\'' +
                '}';
    }
}

Build

/**
 * @Author: Lanys
 * @Description: 图纸
 * @Date: Create in 21:59 2021/8/5
 */
public abstract class Build {

    /**
     * 前轮
     *
     * @param data 数据
     * @return  ElectromobileProduct
     */
    abstract ElectromobileProduct productionFrontWheel(String data);

    /**
     * 车身
     *
     * @param data 数据
     * @return ElectromobileProduct
     */
     abstract ElectromobileProduct productionBodyWork(String data);

    /**
     * 后轮
     *
     * @param data 数据
     * @return ElectromobileProduct
     */
     abstract ElectromobileProduct productionRearWheel(String data);

    /**
     * 产品
     *
     */
    abstract ElectromobileProduct product();
}

Worker

/**
 * @Author: Lanys
 * @Description: 工人
 * @Date: Create in 22:00 2021/8/5
 */
public class Worker extends Build {

    private ElectromobileProduct electromobileProduct;

    public Worker(){
        this.electromobileProduct = new ElectromobileProduct();
    }

    /**
     * 前轮
     *
     * @param data 数据
     * @return  ElectromobileProduct
     */
    @Override
    Build productionFrontWheel(String data) {
        this.electromobileProduct.setFrontWheel(data);
        return this;
    }

    /**
     * 车身
     *
     * @param data 数据
     * @return ElectromobileProduct
     */
    @Override
    Build productionBodyWork(String data) {
        this.electromobileProduct.setBodyWork(data);
        return this;
    }

    /**
     * 后轮
     *
     * @param data 数据
     * @return ElectromobileProduct
     */
    @Override
    Build productionRearWheel(String data) {
        this.electromobileProduct.setRearWheel(data);
        return this;
    }

    /**
     * 产品
     *
     */
    @Override
    ElectromobileProduct product() {
        return this.electromobileProduct;
    }
}

Test

/**
 * @Author: Lanys
 * @Description:
 * @Date: Create in 22:29 2021/8/5
 */
public class Test {
    public static void main(String[] args) {

        System.out.println("--------- 改装前 --------");
        Worker worker = new Worker();
        System.out.println(worker.product().toString());

        System.out.println("--------- 改装后 --------");
        System.out.println(worker.productionFrontWheel("特斯拉前轮").productionBodyWork("野马后轮").product().toString());

    }
}

在这里插入图片描述

总结

建造者模式的优点:

  1. 将产品的建造和表示分离,实现解耦的效果。使用建造者可以使客户端不必知道产品的组成细节。
  2. 使建造者之间互相独立,有利于系统的扩展,符合开闭原则

缺点:

  1. 建造者模式创建的产品一般具有较多的共同点,和相似点;如果产品时间差异性很大,使其范围会受到限制。
  2. 如果产品内部变化复杂,会导致系统变得 很庞大。

应用场景:

  1. 需要生成的产品对象有共性。
  2. 隔离复杂的对象创建和使用,并使得相同的创建过程可以使用不同的产品。
  3. 合适于具有较多的零件(熟属性)产品(对象)的创建过程。
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值