Java 设计模式情景分析——建造者模式

当我们遇到类似汽车的装配,需要车轮、方向盘、发动机,还有各种小零件时,为了在构建过程中隐藏实现细节,就可以使用建造者模式 (Builder模式) 将部件和组装过程分离,使得构建过程和部件都可以自由扩展,两者之间的耦合也降到最低。建造者模式是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示的设计模式。

建造者模式的使用情景:

  • 相同的方法,不同的执行顺序,产生不同的事件结果时;
  • 多个部件,都可以装配到一个对象中,但是产生的运行结果又不相同时;
  • 产品类非常复杂,或者产品类中的调用顺序不同产生了不同的作用时;
  • 当初始化一个对象特别复杂时;

建造者模式在 Java 开发中也较为常用,通常作为配置类的构造器将配置的构建和表示分离开来,同时也是将配置从目标类中隔离出来,避免过多的 setter 方法。

1.建造者模式

建造者模式
优点1、良好的封装性,使用建造者模式可以使客户端不必知道产品内部组成的细节;
2、建造者独立,扩展性好;
缺点1、会产生多余的 Builder 对象,消耗内存;

经典模式 UML 类图:

经典模式 UML 类图

  • Product 产品类:产品的抽象类
  • Builder:抽象 Builder 类,规范产品的组建
  • ConcreteBuilder:具体的 Builder 类
  • Director:统一组装过程

简化模式 链式调用 UML 类图:

链式调用 UML 类图

  • Product 产品类:产品的抽象类
  • Builder:抽象 Builder 类,规范产品的组建
  • ConcreteBuilder:具体的 Builder 类,链式调用

本篇我们给出的实现都是基于链式调用的。

1.链式调用

1、定义 Product 产品类(以组装计算机为例):

public abstract class Computer {
    protected String board;
    protected String display;
    protected String os;
    protected Computer() {
    }
    // 设置主板
    public void setmBoard(String board) {
        this.board = board;
    }
    // 设置显示器
    public void setmDisplay(String display) {
        this.display = display;
    }
    // 设置操作系统
    public abstract void setmOS();
    @Override
    public String toString() {
        return "Computer{" + "board='" + board + '\'' + ", display='" + display + '\'' +
                ", os='" + os + '\'' + '}';
    }
}

具体的 Computer 类:

public class MacBook extends Computer {
    protected MacBook() {
    }
    @Override
    public void setmOS() {
        os = "mac OS Sierra";
    }
}

2、定义抽象 Builder 类,规范产品的组建:

public abstract class Builder {
    // 设置主板
    public abstract Builder setBoard(String board);
    // 设置显示器
    public abstract Builder setDisplay(String display);
    // 设置操作系统
    public abstract Builder setOS();
    // 创建 Computer
    public abstract Computer create();
}

具体的 Builder 类:

public class MacBookBuilder extends Builder {
    private Computer mComputer = new MacBook();
    @Override
    public Builder setBoard(String board) {
        mComputer.setmBoard(board);
        return this;
    }
    @Override
    public Builder setDisplay(String display) {
        mComputer.setmDisplay(display);
        return this;
    }
    @Override
    public Builder setOS() {
        mComputer.setmOS();
        return this;
    }
    @Override
    public Computer create() {
        return mComputer;
    }
}

链式调用的关键点是每个 setter 方法都返回自身,也就是 return this; 这样就使得 setter 方法可以为链式调用。

测试代码:

@Test
public void test() throws Exception {
    // 链式调用
    Computer computer = new MacBookBuilder().setBoard("Intel").setDisplay("Retina").setOS().create();
}
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值