设计模式之建造者模式

1. 建造者模式

对象的创建往往是复杂的,在软件开发过程中有时需要创建一个复杂的对象,这个复杂的对象通常由多个子部件按一定的步骤组合而成。比如房子有各式各样的,但建造方法的步骤大同小异都是先搭建地基、再砌墙、最后封盖屋顶。建造者模式旨在将一个复杂对象的构造与它的表示分离开来,使同样的构建过程可以创建不同的表示,建造者的角色如下:

  • 产品:需要构建的对象,是具有不同表现形式的复杂或复合对象。
  • 抽象建造者:用于声明构建产品类组成部分的抽象类或接口。
  • 具体建造者:用于实现抽象建造者,实现具体的建造过程,生成完整产品。
  • 指挥者:用于指挥如何构建产品。

例如生活中构建一个电脑产品,需要选择主机、显示器、键盘、鼠标来进行组装,客户提供具体的原材料描述需要一个什么样的电脑,设计师规划组装流程交给组装师建造,如下:

在这里插入图片描述

2. 建造者实现

通过建造者模式实现电脑的组装,要求组装一个主机为联想、显示器为华为、键盘和鼠标为小米的电脑。

2.1 产品类

新建一个产品类,类名称:Computer,内容如下:

public class Computer {

    // 主机
    private String host;

    // 显示器
    private String display;

    // 键盘
    private String keyboard;

    // 鼠标
    private String mouse;

    public void setHost(String host) {
        this.host = host;
    }

    public void setDisplay(String display) {
        this.display = display;
    }

    public void setKeyboard(String keyboard) {
        this.keyboard = keyboard;
    }

    public void setMouse(String mouse) {
        this.mouse = mouse;
    }

    @Override
    public String toString() {
        return String.format("主机:%s 显示器:%s 键盘:%s 鼠标:%s", host, display, keyboard, mouse);
    }
}

2.2 抽象建造者

新建一个抽象者类,类名称为:AbstractBuilder,内容如下:

public abstract class AbstractBuilder {
    protected Computer product = new Computer();

    // 组装主机
    abstract protected void buildHost();

    // 组装显示器
    abstract protected void buildDisplay();

    // 组装键盘
    abstract protected void buildKeyboard();

    // 组装鼠标
    abstract protected void buildMouse();

    // 获取成品
    public Computer getProduct(){
        return product;
    }
}

2.3 具体建造者

新建一个建造者实现抽象建造者,类名称:ComputerBuilder,内容如下:

public class ComputerBuilder extends AbstractBuilder{

    @Override
    protected void buildHost() {
        System.out.println("组装联想主机");
        product.setHost("联想主机");
    }

    @Override
    protected void buildDisplay() {
        System.out.println("组装华为显示器");
        product.setDisplay("华为显示器");
    }

    @Override
    protected void buildKeyboard() {
        System.out.println("组装小米键盘");
        product.setKeyboard("小米键盘");
    }

    @Override
    protected void buildMouse() {
        System.out.println("组装小米鼠标");
        product.setMouse("小米鼠标");
    }
}

2.4 指挥者

新建一个指挥者,类名称:Director,内容如下:

public class Director {
    private AbstractBuilder builder;

    public Director(AbstractBuilder builder) {
        this.builder = builder;
    }

    // 定义建造流程
    public Computer construct(){
        builder.buildHost();
        builder.buildDisplay();
        builder.buildKeyboard();
        builder.buildMouse();
        return builder.getProduct();
    }
}

2.5 客户端

新建一个客户端需要一台电脑,类名称:Client,内容如下:

public class Client {
    public static void main(String[] args) {
        // 建造者
        AbstractBuilder builder = new ComputerBuilder();
        // 指挥者
        Director director = new Director(builder);
        // 生产产品
        Computer product = director.construct();
        // 获取产品规格
        System.out.println(product.toString());
    }
}

在这里插入图片描述

3. 建造者应用

在JDK的类库中StringBuilder就是建造者模式的体现,其类图结构如下:

在这里插入图片描述

  • 产品:字符串,即AbstractStringBuilder类的char[] value
  • 抽象建造者:Appendable接口定义了建造者的行为,即append方法
  • 具体建造者:AbstractStringBuilder抽象类实现了Appendable接口,实现了append方法,它只是不能实例化而已
  • 指挥者:StringBuilder类继承了AbstractStringBuilder类,StringBuilder的append方法都是super.append,StringBuilder只是一个门面。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值