建造者模式(Builder Pattern)

建造者模式(将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式)
  • 例子:一台电脑由主机、电脑显示器、键盘、鼠标四个部件组成,不同品牌电脑部件型号不同,类图如下:
    在这里插入图片描述

  • 建造者模式的主要角色
    产品角色(Product):它是包含多个组成部件的复杂对象。
    抽象建造者(Builder):包含创建产品各个子部件的抽象方法接口,通常还包含一个返回复杂产品的方法 getResult()。
    具体建造者(Concrete Builder):实现复杂产品的各个部件的具体创建方法。
    指挥者(Director):调用建造者对象中部件构造方法并返回产品。

  • 代码实现

产品角色

/**
 * 电脑
 */
public class Computer {
    // 主机
    private String hostComputer;
    // 电脑显示器
    private String computerMonitors;
    // 键盘
    private String keyboard;
    // 鼠标
    private String mouse;
    public void setHostComputer(String hostComputer) {
        this.hostComputer = hostComputer;
    }
    public void setComputerMonitors(String computerMonitors) {
        this.computerMonitors = computerMonitors;
    }
    public void setKeyboard(String keyboard) {
        this.keyboard = keyboard;
    }
    public void setMouse(String mouse) {
        this.mouse = mouse;
    }
    public void show() {
        System.out.println("电脑=" + hostComputer + "+" + computerMonitors + "+" + keyboard + "+" + mouse);
    }
}

抽象建造者

/**
 * 建造者
 */
public abstract class Builder {
    Computer computer = new Computer();
    abstract void buildHostComputer();
    abstract void buildComputerMonitors();
    abstract void buildKeyboard();
    abstract void buildMouse();
    public Computer getResult() {
        return computer;
    }
}

具体建造者

/**
 * 华为工厂工人
 */
public class HuaweiWorker extends Builder {
    @Override
    void buildHostComputer() {
        super.computer.setHostComputer("华为主机");
    }
    @Override
    void buildComputerMonitors() {
        super.computer.setComputerMonitors("华为显示器");
    }
    @Override
    void buildKeyboard() {
        super.computer.setKeyboard("华为键盘");
    }
    @Override
    void buildMouse() {
        super.computer.setMouse("华为鼠标");
    }
}
/**
 * 苹果工厂工人
 */
public class AppleWorker extends Builder {
    @Override
    void buildHostComputer() {
        super.computer.setHostComputer("苹果主机");
    }
    @Override
    void buildComputerMonitors() {
        super.computer.setComputerMonitors("苹果显示器");
    }
    @Override
    void buildKeyboard() {
        super.computer.setKeyboard("苹果键盘");
    }
    @Override
    void buildMouse() {
        super.computer.setMouse("苹果鼠标");
    }
}

指挥者

/**
 * 指挥者
 */
public class Director {
    private Builder builder;
    public Director(Builder builder) {
        this.builder = builder;
    }
    public Computer construct() {
        builder.buildHostComputer();
        builder.buildComputerMonitors();
        builder.buildKeyboard();
        builder.buildMouse();
        return builder.getResult();
    }
}

测试

public class Test {
    public static void main(String[] args) {
        Director huaweiDirector = new Director(new HuaweiWorker());
        Computer huaweiComputer = huaweiDirector.construct();
        huaweiComputer.show();
        Director appleDirector = new Director(new AppleWorker());
        Computer appleComputer = appleDirector.construct();
        appleComputer.show();
    }
}
// 运行结果
电脑=华为主机+华为显示器+华为键盘+华为鼠标
电脑=苹果主机+苹果显示器+苹果键盘+苹果鼠标
  • 使用场景
    1、相同的方法,不同的执行顺序,产生不同的结果。
    2、多个部件或零件,都可以装配到一个对象中,但是产生的结果又不相同。
    3、产品类非常复杂,或者产品类中不同的调用顺序产生不同的作用。
    4、初始化一个对象特别复杂,参数多,而且很多参数都具有默认值。
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值