生成器模式是一种创建型设计模式, 使你能够分步骤创建复杂对象。 该模式允许你使用相同的创建代码生成不同类型和形式的对象。
例如, 我们来思考如何创建一个 房屋House对象。 建造一栋简单的房屋, 首先你需要建造四面墙和地板, 安装房门和一套窗户, 然后再建造一个屋顶。 但是如果你想要一栋更宽敞更明亮的房屋, 还要有院子和其他设施 (例如暖气、 排水和供电设备), 那又该怎么办呢?
最简单的方法是扩展 房屋基类, 然后创建一系列涵盖所有参数组合的子类。 但最终你将面对相当数量的子类。 任何新增的参数 (例如门廊类型) 都会让这个层次结构更加复杂。
另一种方法则无需生成子类。 你可以在 房屋基类中创建一个包括所有可能参数的超级构造函数, 并用它来控制房屋对象。 这种方法确实可以避免生成子类, 但它却会造成另外一个问题。拥有大量输入参数的构造函数也有缺陷: 这些参数也不是每次都要全部用上的。
生成器模式建议将对象构造代码从产品类中抽取出来, 并将其放在一个名为_生成器_的独立对象中。
Java 示例代码:
import java.util.*;
public class Main {
public static void main(String[] args) {
Director director = new Director();
Builder builder1 = new Builder1();
director.Construct(builder1);
Product product1 = builder1.getResult();
product1.show();
Builder builder2 = new Builder2();
director.Construct(builder2);
Product product2 = builder2.getResult();
product2.show();
}
}
class Director {
public void Construct(Builder builder) {
builder.BuildPart();
}
}
abstract class Builder {
public abstract void BuildPart();
public abstract Product getResult();
}
class Builder1 extends Builder {
Product product = new Product();
@Override
public void BuildPart() {
product.Add(“A”);
product.Add(“B”);
product.Add(“C”);
product.Add(“D”);
product.Add(“E”);
product.Add(“F”);
}
@Override
public Product getResult() {
return product;
}
}
class Builder2 extends Builder {
Product product = new Product();
@Override
public void BuildPart() {
product.Add(“A”);
product.Add(“B”);
product.Add(“C”);
}
@Override
public Product getResult() {
return product;
}
}
class Product {
List parts = new ArrayList();
public void Add(String part) {
parts.add(part);
}
public void show() {
System.out.print(“产品的组成:”);
for (String s : parts)
System.out.print(s + " ");
System.out.print(“\n”);
}
}