基本介绍
1.建造者模式,又叫生成器模式
2.将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象
事项
1.优点
(1)易于解耦:客户端不需要知道内部的具体构建细节,将产品本身与创建过程进行解耦,允许用户只通过指定复杂对象的类型和内容就构建对象,使用相同的创建过程来得到不同的产品,符合依赖倒转原则
(2)易于精准控制对象的创建:将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰
(3)易于扩展:增加新的具体构建者无需修改原有的代码,易于扩展,符合开闭原则
2.缺点
(1)建造者模式所创建的产品一般具有较多的共同点,其组成部分相似;如果产品之间的差异性很大,则不适合使用建造者模式,其使用范围受到一定的限制
(2)如果产品的内部变化复杂,导致需要定义很多具体建造者类来实现这种变化,导致系统变得庞大
3.抽象工厂模式、建造者模式
(1)抽象工厂模式:实现对产品家族的创建,一个产品家族是一系列产品,具有不同分类维度的产品组合,采用抽象工厂模式不需要关心构建过程,只关心什么产品由什么工厂生产即可
(2)建造者模式:要求按照指定的规范建造产品,主要目的是通过组装零配件而产生一个新产品
4.应用场景
(1)需要生成的产品对象有复杂的内部结构,这些产品对象具备共性
(2)隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品
(3)需要生成的对象内部属性本身相互依赖
四种角色
1.产品: 一个具体的产品对象
2.抽象建造者: 创建一个产品对象的各个部件指定的接口/抽象类
(1)规范具体建造者的方法
(2)是多个规范相同的具体建造者的抽象
3.具体建造者: 实现接口/继承抽象类
(1)在规范下,实现具体的建造方法
(2)一个具体建造者对应一个具体产品
4.指挥者: 构建一个使用抽象建造者的对象
(1)隔离客户端与产品对象的生产过程
(2)控制产品对象的生产流程
(3)所有具体建造者的生产流程一致
JDK 中的 StringBuilder
1.Appendable 接口定义了多个 append 方法(抽象方法), 即 Appendable 为抽象建造者, 定义了抽象方法
2. AbstractStringBuilder 实现了 Appendable 接口方法,AbstractStringBuilder 已经是具体建造者,但不能实例化
3.StringBuilder 即充当了指挥者,同时充当了具体建造者,因为 StringBuilder 继承了 AbstractStringBuilder,建造方法的实现由 AbstractStringBuilder 完成
代码示例
public class Builder {//客户端
public static void main(String[] args) {
//创建指挥者
Director director = new Director();
//传入具体建造者
director.setAbstractBuilder(new ConcreteBuilder());
//生产产品并接收
Product product = director.build();
}
}
class Director {//指挥者
public AbstractBuilder abstractBuilder;
//传入具体建造者,决定创建哪种产品
public void setAbstractBuilder(AbstractBuilder abstractBuilder) {
this.abstractBuilder = abstractBuilder;
}
//控制产品的生产流程
public Product build() {
abstractBuilder.Step();
return abstractBuilder.finish();
}
}
abstract class AbstractBuilder {//抽象建造者
public Product product = new Product();//初始化时是未完成品
//规范建造方法
public abstract void Step();
//建造完成,返回产品
public Product finish() {
return product;
}
}
class ConcreteBuilder extends AbstractBuilder {//Product的具体建造者
//实现建造方法
public void Step() {
}
}
class Product {//产品
}