设计模式之建造者模式

在人生的道路上,不管是潇洒走一回,或者是千山独行,皆须是自己想走的路,虽然,有的人并不是很快就能找到自己的方向和道路,不过,只要坚持到底,我相信,就一定可以找到自己的路,只要找到路,就不必怕路途遥远了。

导读:本篇文章讲解 设计模式之建造者模式,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

4.建造者模式

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

工厂:(建造者模式)负责建造汽车(组装过程和细节在工厂内)

客户:只需要说出需要的型号(对象得类型和内容),然后就直接购买可以使用(不需知道汽车的组装过程,零件等等)

  • 角色分析

Driector—指挥—>抽象的Builder<—实现—具体的builder—生产—>具体的产品

4.2 举例步骤:
  • 抽象的建造者:规定协议或步骤
//抽象的建造者:规定协议或步骤
public abstract class Builder {
    abstract void step1();
    abstract void step2();
    abstract void step3();
    abstract void step4();
    abstract Protuct getProtuct();
}
  • 产品
public class Protuct {
    private String step1;
    private String step2;
    private String step3;
    private String step4;

    public String getStep1() {
        return step1;
    }

    public void setStep1(String step1) {
        this.step1 = step1;
    }

    public String getStep2() {
        return step2;
    }

    public void setStep2(String step2) {
        this.step2 = step2;
    }

    public String getStep3() {
        return step3;
    }

    public void setStep3(String step3) {
        this.step3 = step3;
    }

    public String getStep4() {
        return step4;
    }

    public void setStep4(String step4) {
        this.step4 = step4;
    }

    @Override
    public String toString() {
        return "Protuct{" +
                "step1='" + step1 + '\'' +
                ", step2='" + step2 + '\'' +
                ", step3='" + step3 + '\'' +
                ", step4='" + step4 + '\'' +
                '}';
    }
}
  • 具体建造师实现协议
//具体建造师
public class Worker extends Builder{
    private Protuct protuct;


    public Worker() {           //实际建造者创建产品,产品非传入,而是由其创建而来
        protuct = new Protuct();
    }

    @Override
    void step1() {
        protuct.setStep1("步骤1");
    }

    @Override
    void step2() {
        protuct.setStep2("步骤2");
    }

    @Override
    void step3() {
        protuct.setStep3("步骤3");
    }

    @Override
    void step4() {
        protuct.setStep4("步骤4");
    }

    @Override
    Protuct getProtuct() {
        return protuct;
    }
}
  • 指挥者创建对象
//核心:通过指挥者来创建对象;负责构建一个工程
public class Driector {

    public Protuct build(Worker worker){ //指挥者指挥建造者建造产品,指挥不同的建造者建造不同的产品
        //构建顺序可变
        worker.step1();
        worker.step2();
        worker.step3();
        worker.step4();
        return worker.getProtuct();
    }
}
  • 测试
@Test
public void testBuilder(){
    Driector driector = new Driector();
    Protuct build = driector.build(new Worker());
    System.out.println(build.toString());
}

Protuct{step1='步骤1', step2='步骤2', step3='步骤3', step4='步骤4'}
4.3 建造者模式构成简化
  • 上述举例是建造者模式常规用法,Driector在此模式中具有重要作用,用于指导如何构建产品,控制调用先后次序,向调用者返回实际产品,有些情况需要简化系统结构,可以把Director和抽象者进行结合

  • 通过静态内部类的方式实现零件无序装配构造,此方式灵活,更符合定义。内部有复杂对象的默认实现,使用时可以根据用户需要自由定义更改内容,并且无需改变具体的构造方式。就可以生产出不同复杂产品。

  • 举例:

  • 抽象的建造者:规定协议或步骤

//抽象的建造者:规定协议或步骤
public abstract class Builder {
    abstract Builder step1(String args);
    abstract Builder step2(String args);
    abstract Builder step3(String args);
    abstract Builder step4(String args);
    abstract Protuct getProtuct();
}
  • 产品
public class Protuct {
    private String step1 = "默认步骤1";
    private String step2 = "默认步骤2";
    private String step3 = "默认步骤3";
    private String step4 = "默认步骤4";

    public String getStep1() {
        return step1;
    }

    public void setStep1(String step1) {
        this.step1 = step1;
    }

    public String getStep2() {
        return step2;
    }

    public void setStep2(String step2) {
        this.step2 = step2;
    }

    public String getStep3() {
        return step3;
    }

    public void setStep3(String step3) {
        this.step3 = step3;
    }

    public String getStep4() {
        return step4;
    }

    public void setStep4(String step4) {
        this.step4 = step4;
    }

    @Override
    public String toString() {
        return "Protuct{" +
                "step1='" + step1 + '\'' +
                ", step2='" + step2 + '\'' +
                ", step3='" + step3 + '\'' +
                ", step4='" + step4 + '\'' +
                '}';
    }
}
  • 具体建造师
//具体建造师
public class Worker extends Builder {
    private Protuct protuct;


    public Worker() {           //实际建造者创建产品,产品非传入,而是由其创建而来
        protuct = new Protuct();
    }

    @Override
    public Worker step1(String msg) {
        protuct.setStep1(msg);
        return this;
    }

    @Override
    public Worker step2(String msg) {
        protuct.setStep2(msg);
        return this;
    }

    @Override
    public Worker step3(String msg) {
        protuct.setStep3(msg);
        return this;
    }

    @Override
    public Worker step4(String msg) {
        protuct.setStep4(msg);
        return this;
    }

    @Override
    public Protuct getProtuct() {
        return protuct;
    }
}
  • 客户调用:链式编程
@Test
public void testNoDriectorBuilder(){
    //实际建造者
    nodriectorbuilder.Worker worker = new nodriectorbuilder.Worker();
    //链式编程和springBoot中调用对应
    //客户自己即为指挥者
    nodriectorbuilder.Protuct build = worker.step1("A实现").getProtuct();
    System.out.println(build.toString());
}
4.4 优缺点
  • 优点:

产品建造和表示分离,实现解耦,使用建造者模式可以是客户端屏蔽产品内部实现细节

将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰

具体建造者类之间是相互独立的,有利于系统扩展。增加新的具体建造者无需修改之前的类库。符合开闭原则

  • 缺点

建造者模式所创建的产品一般具有较多的共同点,组成部分相似;若产品之间差异较大,就不适合使用建造者模式,所以使用范围受到一定限制

若产品内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得庞大。

4.5 应用场景
  • 需要生成的产品对象有复杂的内部结构,这些产品对象具备共性
  • 隔离复杂对象的创建和使用,并是的相同的创建过程可以创建不同的产品
  • 适合一个具有较多属性的对象的创建过程
4.6 和抽象工厂模式比较
  • 建造者模式返回一个组装好的完整产品,抽象工厂模式返回一系列相关的产品,这些产品位于不同的产品等级结构,构成一个产品簇
  • 抽象工厂模式客户端实例化工厂类,然后调用工厂方法获得所需的对象。建造者模式客户端可以不直接调用建造者的相关方法,而是直接通过指挥者类来知道如何生成对象,包括对象的组装过程和建造步骤,侧重于一步步构造复杂对象,返回一个完整的对象
  • 将抽象工厂模式看成汽车配件生产工厂,生产一个产品簇产品。建造者模式就是一个汽车组装工厂,通过对部件的组装返回一辆完整汽车

本专栏下一篇:设计模式之原型模式

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/123932.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!