一.概述
- 当我们需要一架飞机时,它们的组成有内部极其复杂的逻辑.部件的构成不是直接内部一个单位完成,而是由多个厂家来完成.我们在完成.
- 概念:当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时,当构造过程允许被构造的对象有不同的标识时.这种方式我们称为生成器模式.
- 简单而言,它有点类似工厂模式,他的目的是为了分离复杂对象的构建与它的表示相分离.
二.为什么需要生成器模式
是为了将构建复杂对象的过程和它的部件解耦.注意:是解耦过程和部件,一个复杂的对象,它不仅仅有复杂的部件,而且还有复杂的装配方式,比如波音飞机,不仅拥有轮子,发送机,螺旋桨,机翼...,装配方式也会非常的复杂.builder就是为了将部件和组装过程分开.
三.生成器模式的构成
类图
- 产品:一个复杂的对象,它拥有复杂的部件,并且拥有复杂的装配方式;
- 抽象的生成器:定义公共的产品的生成的接口;
- 具体的生成器:实现抽象的生成器,实现产品的具体的生成和装配方式.
- 指挥者:调用具体的生成器,实现产品的最终的生成方式和细节;
四.代码
public class MainTest {
public static void main(String[] args) {
Director director = new Director(new BmwProductBuilder());
CarProduct generate = director.generate();
System.out.println(generate.wheel);
Director audiGenerate = new Director(new AudiProductBuilder());
CarProduct audi = audiGenerate.generate();
System.out.println(audi.wheel);
}
}
// 产品
class CarProduct {
String wheel;
public String getWheel() {
return wheel;
}
public void setWheel(String wheel) {
this.wheel = wheel;
}
}
// 抽象的生成器
interface ProductBuilder {
void createWheel();
CarProduct getCarProduct();
}
// 具体的生成器 -- 宝马
class BmwProductBuilder implements ProductBuilder {
private CarProduct carProduct;
@Override
public void createWheel() {
carProduct = new CarProduct();
carProduct.setWheel("8个大轮子");
}
@Override
public CarProduct getCarProduct() {
return carProduct;
}
}
// 具体的生成器 -- 奥迪
class AudiProductBuilder implements ProductBuilder {
private CarProduct carProduct;
@Override
public void createWheel() {
carProduct = new CarProduct();
carProduct.setWheel("6个小轮子");
}
@Override
public CarProduct getCarProduct() {
return this.carProduct;
}
}
// 指挥者
class Director {
private ProductBuilder productBuilder;
public Director(ProductBuilder productBuilder) {
this.productBuilder = productBuilder;
}
public CarProduct generate() {
productBuilder.createWheel();
return productBuilder.getCarProduct();
}
}
五.与工厂模式的区别
- 工厂模式和生成器模式是经常引起混淆很困扰的模式,不过仔细体会这两种模式的意图就可以发现,它们关注的重点不同.工厂模式的重点在于产品的系列化生成问题.工厂方法解决一种产品细节差异,抽象工厂解决多种产品细节差异.
- 生成器模式关注的复杂产品的创建细节----如何将复杂产品一步步完成部件的创建和组装过程.
六.使用场景
- 当创建对象的复杂算法应该独立于该对象的组成部分和它们的装配方法时
- 当构建过程必须允许被构建的对象有不同的表示时.
七.参考文献
大话设计模式