23种设计模式(3) - 创建者模式
1、定义
将一个复杂对象的创建和他的表示分离,使用同样的创建过程可以创建不同的表示(类的不同属性的实例)。
2、UML 图
3、组成
- 产品类(Product):一般是比较复杂的类,即创建该类实例的过程比较复杂
- 抽象创建者类(IProductBuilder):创建者的抽象接口类,定义了创建对象的步骤,不同的产品创建类可以实现该接口,设计自己的实现
- 创建者(ProductABuilder、ProductBBuilder):负责创建具体的对象实例,封装了创建类的过程。一般有两步分组成,分别是 创建产品的步骤,和返回创建好的对象
- 导演类(Director):负责调用适当的创建者来创建产品,一般直接和创建者交互,不会直接和产品类交互
4、代码
// 复杂的对象,产品类
public class Product {
private List<String> parts = new ArrayList<>();
// 需要添加多个组件才能创建产品
public void addPart(String part) {
this.parts.add(part);
}
public void show() {
System.out.println("本产品所有组件有:" + parts.toString());
}
}
// 抽象创建者
public interface IProductBuilder {
// 创建步骤
void buildPart1();
void buildPart2();
// 获得创建好的产品
Product getProduct();
}
// A产品的创建者
public class ProductABuilder implements IProductBuilder {
private Product product = new Product();
// 创建A产品的步骤1
@Override
public void buildPart1() {
product.addPart("产品A-部件1");
}
// 创建A产品的步骤2
@Override
public void buildPart2() {
product.addPart("产品A-部件2");
}
@Override
public Product getProduct() {
return product;
}
}
// B产品的创建者
public class ProductBBuilder implements IProductBuilder {
private Product product = new Product();
// 创建产品B的步骤1
@Override
public void buildPart1() {
product.addPart("产品B-部件1");
}
// 创建产品B的步骤2
@Override
public void buildPart2() {
product.addPart("产品B-部件2");
}
@Override
public Product getProduct() {
return product;
}
}
// 导演类,负责调用创建者生成对象
public class Director {
public Product getProduct(IProductBuilder builder){
builder.buildPart1();
builder.buildPart2();
return builder.getProduct();
}
}
// 调用者
public class Main {
public static void main(String[] args) {
Director director = new Director();
Product productA = director.getProduct(new ProductABuilder());
Product productB = director.getProduct(new ProductBBuilder());
productA.show();
productB.show();
}
}
运行结果:
本产品所有组件有:[产品A-部件1, 产品A-部件2]
本产品所有组件有:[产品B-部件1, 产品B-部件2]
5、优点
- 封装性好。将复杂对象的创建过程封装,调用者不需要关心创建的过程
- 拓展性好。如果有新的产品,只需要增加一个产品创建者,而不用修改已有的代码
6、和工厂模式的区别
可以发现,创建者模式和工厂模式很相似,都是用来创建对象实例,区别是 创建者模式多了个 导演类 。
与工厂模式相比,创建者模式主要用来创建 比较复杂的对象。因为创建的对象比较复杂,所以需要独立出一个单独的类,即 导演类,来负责这个创建的流程;而工厂类则直接创建对象。
7、适用场景
主要用于创建一些比较复杂的对象,这些对象的内部构建顺序通常比较稳定,但是对象构造的 参数/属性 会有区别。所以,如果一个对象的创建比较复杂,使用工厂模式;如果一个对象的创建特别负责,使用创建者模式。