0、背景
建造模式(Builder模式)
假如有一个需求:盖房子,盖房子过程是一致的:打桩、砌墙、封顶。但是房子是各式各样的,最后盖出来的房子可能是高楼或别墅。
根据直接的思路,不用设计模式思想,我们也许会:
- 写一个 CommonHouse 抽象类,然后里面规定了打桩、砌墙、封顶三个方法;
- 让不同房子继承这个类;
- 最后调用的时候调用分别的方法即可。
在继承抽象类、子类区分这一块,思想没有问题,问题出现这些类本身。
缺点:
过于简单,将产品(房子)和创建产品(房子建造流程)封装在了一起,耦合性增强了。(可以理解为,面向对象的思想里,房子虽然是一个类,拥有自己的方法,但是房子不应该拥有建造自己的方法)
解决方法:
解耦 - > 建造者模式。
一、建造者模式
建造者模式(Builder Pattern)又叫生成器模式,是一种对象构建模式(创建型),可以将复杂对象的建造过程抽象出来(抽象类),使这个抽象过程的不同实现方法能构造出不同表现(属性)的对象。
建造模式允许用户只通过指定复杂对象的类型和内容就可以构建他们,用户不需要知道内部的具体构建细节。
建造者模式的四个角色:
- Product产品:一个具体产品对象;
- Builder(抽象建造者):创建Product对象指定的 接口或者抽象类;
- ConcreteBuilder具体建造者:实现接口,构建和装配各个部件;
- Director指挥者:构建一个使用Builder接口的对象,主要用于创建一个复杂度对象,有两个作用:一是隔离客户与对象的生产过程,二是负责控制产品对象的生产过程。
他们之间的关系,我们用类图来解释:
- Directer里面聚合一个Builder实际上使用的是他的实现类ConcreteBuilder;
- ConcreteBuilder可以有很多,就是所谓的不同的房子的建造者。
因为getRusult是一样的,所以暂时不用接口,用抽象类实现Builder,代码如下:
/*
产品,对应product
*/
public class House {
private String base;
private String wall;
private String roof;
//对应getset方法
}
/*
抽象的建造者,对应Builder
*/
public abstract class HouseBuilder {
protected House house = new House();
//写好流程的各个方法,但不约束具体执行
public abstract void buildBasic()