创建者模式——建造者模式

3.4 建造者模式

在软件开发过程中有时需要创建一个复杂的对象,这个复杂对象通常由多个子部件按一定的步骤组合而成。例如,计算机是由 CPU、主板、内存、硬盘、显卡、机箱、显示器、键盘、鼠标等部件组装而成的,采购员不可能自己去组装计算机,而是将计算机的配置要求告诉计算机销售公司,计算机销售公司安排技术人员去组装计算机,然后再交给要买计算机的采购员。

建造者(Builder)模式的定义:将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示。它将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成,将变与不变分离,即产品的组成部分是不变的,但每一部分是灵活选择的。

优点:
  1. 实现了构建和装配的解耦。不同的构建器,相同的装配,也可以做出不同的对象;相同的构建器,不同的装配顺序也可以做出不同的对象,也就实现了构建算法、装配算法的解耦,实现了更好的复用。
  2. 建造者模式将部件与其组装过程分离,一步一步创建一个复杂的对象。用户只需要指定复杂对象的类型就可以得到该对象,而无需知道其内部细节。
缺点:
  1. 产品的组成部分必须相同,限制了使用范围
  2. 如果产品内部复杂,产品内部发生了变化,建造者也需要进行修改,后期维护成本大。
与工厂方法模式:

建造者(Builder)模式和工厂模式的关注点不同:建造者模式注重零部件的组装过程,而工厂方法模式更注重零部件的创建过程,但两者可以结合使用。

模式的结构与实现:

建造者(Builder)模式包含如下角色:

  • 抽象建造者(Builder):这个借口规定要实现复杂对象的那些部分的创建,并不设计具体的对象部件的创建。
  • 具体建造者(ConcreterBuilder):实现 Builder接口,完成复杂产品的各个部件的具体创建方法。构造完成后提供产品的实例。
  • 产品类(Product):要创建的复杂对象。
  • 指挥者类(Director):调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按照某种顺序创建。

image-20220329164431783

//产品类
class Product {
    private String partA;
    private String partB;
    private String partC;

    public void setPartA(String partA) {
        this.partA = partA;
    }

    public void setPartB(String partB) {
        this.partB = partB;
    }

    public void setPartC(String partC) {
        this.partC = partC;
    }

    public void show() {
        //显示产品的特性
    }
}

//抽象建造者
abstract class Builder {
    //创建产品对象
    protected Product product = new Product();

    public abstract void buildPartA();

    public abstract void buildPartB();

    public abstract void buildPartC();

    //返回产品对象
    public Product getResult() {
        return product;
    }
}


//具体建造者
public class ConcreteBuilder extends Builder {
    public void buildPartA() {
        product.setPartA("建造 PartA");
    }

    public void buildPartB() {
        product.setPartB("建造 PartB");
    }

    public void buildPartC() {
        product.setPartC("建造 PartC");
    }
}


//指挥者
class Director {
    private Builder builder;

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

    //产品构建与组装方法
    public Product construct() {
        builder.buildPartA();
        builder.buildPartB();
        builder.buildPartC();
        return builder.getResult();
    }
}

//客户类
public class Client {
    public static void main(String[] args) {
        Builder builder = new ConcreteBuilder();
        Director director = new Director(builder);
        Product product = director.construct();
        product.show();
    }
}
模式的应用场景

建造者(Builder)模式创建的是复杂对象,其产品的各个部分经常面临着剧烈的变化,但将它们组合在一起的算法却相对稳定。

  • 创建的对象较复杂,由多个部件构成,各部件面临复杂的变化,但构件间的建造顺序是稳定的;
  • 创建复杂对象的算法独立于该对象的组成部分以及它们的装配方式,即产品的构建过程和最终表示是独立的;
  • 初始化一个对象特别复杂,参数多,而且很多参数都具有默认值。

3.5 建造者模式与工厂模式的区别

  1. 建造者模式更关注方法的顺序,工厂模式更关注创建的对象;
  2. 创建对象的力度不同,建造者模式创建复杂对象,工厂模式创建的对象都一样;
  3. 关注重点不同,工厂模式只需要把对象创建出来就行了,而建造者模式还需要知道对象由哪些部件组成;
  4. 建造者模式更加建造过程中的顺序不一样,最终对象部件组成也不一样。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yiyiqwq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值