生成器模式
内容:将一个复杂对象的构建与其表示分离,使得同样的构建过程可以产生出不同的表示。
结构:
1、产品:具体生成器要构造的复杂对象。
2、抽象生成器:定义了生成复杂对象各个组成部分的抽象方法,并定义了返回产品实例的方法。
3、具体生成器:抽象生成器的子类,实现了抽象生成器中的抽象方法。
4、指挥者:其是一个包含生成器引用的类,通过不同的生成器来为用户构造出不同的产品对象。
UML类图:
优点:
将对象的构造过程封装在具体的生成器中,用户使用不同的生成器就可以得到不同的产品对象,生成器模式可以精细的控制产品对象的构造过程,用户无须了解产品对象的具体组件,可以随时增加具体生成器,但指挥者无须做任何变动。
适用情境:
系统要求对象的构造过程必须独立于创建该对象的类时;无法通过构造方法来创建内部复杂的对象。
使用实例:
//定义包含了两个组件的产品
public class Product {
String stringComponent;
Integer integerComponent;
public String getStringComponent() {
return stringComponent;
}
public Integer getIntegerComponent() {
return integerComponent;
}
}
//定义抽象生成器
public interface Builder {
public abstract void buildStringComponent();
public abstract void buildIntegerComponent();
public abstract Product getProduct();
}
//具体生成器A
public class ABuilder implements Builder {
private Product product;
public ABuilder(){
this.product = new Product();
}
@Override
public void buildStringComponent() {
// TODO Auto-generated method stub
this.product.stringComponent = new String("AAA");
}
@Override
public void buildIntegerComponent() {
// TODO Auto-generated method stub
this.product.integerComponent = new Integer(0+'A');
}
@Override
public Product getProduct() {
// TODO Auto-generated method stub
return this.product;
}
}
//具体生成器B
public class BBuilder implements Builder {
private Product product;
public BBuilder(){
this.product = new Product();
}
@Override
public void buildStringComponent() {
// TODO Auto-generated method stub
this.product.stringComponent = new String("BBB");
}
@Override
public void buildIntegerComponent() {
// TODO Auto-generated method stub
this.product.integerComponent = new Integer(0+'B');
}
@Override
public Product getProduct() {
// TODO Auto-generated method stub
return this.product;
}
}
//指挥者
public class Director {
private Builder builder;
public Director(Builder builder){
this.builder = builder;
}
public Product constructProduct() {
this.builder.buildStringComponent();
this.builder.buildIntegerComponent();
return this.builder.getProduct();
}
}
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Builder builder = new ABuilder();
Director director = new Director(builder);
Product product = director.constructProduct();
System.out.println(product.getStringComponent()+":"+product.getIntegerComponent());
builder = new BBuilder();
director = new Director(builder);
product = director.constructProduct();
System.out.println(product.getStringComponent()+":"+product.getIntegerComponent());
}
}
生成器模式的精髓是将一个含有多个组件的对象的创建过程分成若干步骤,并将这些步骤封装在一个称为生成器的接口中。