生成器模式
简介
生成器模式与工厂方法模式二者有相似之处,二者都属于创建型设计模式,并且都将对象创建的任务交给一个单独的类去完成。
生成器模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。生成器模式按照一个指定的过程逐步创建一个复杂的对象,他允许用户只通过指定复杂对象的类型和内容就可以构架它们,而不必知道内部的具体构建细节。生成器的主要思想是抽象出构建对象的步骤,使得这些步骤的不同实现可以创建对象的不同表示。通常,生成器模式被用来创建符合组合模式的产品对象。
特点
(1)生成器让用户可以变化它建造产品的内部表示方式,它也隐藏了产品怎样装配的细节。
(2)每个具体的生成器都独立于程序的其他生成器,因此改善了程序的模块化,而且使添加其他生成器变得相对简单。
(3)由于每个生成器根据数据逐步的构架最终产品,用户对生成器构建的最终产品有更多的控制。
(4)生成器模式与抽象工厂模式有相似之处,都返回由其他一些对象组成的类的对象。主要区别是:抽象工厂模式返回一个类族,而生成器模式逐步按照次序构建一个负载的对象,最后该对象被返回。
示例
具体的产品类
class House
{
private String type = null;
private String area;
private String bedroom;
private String bathroom;
private String garage;
int house_low_price = 5000;
int house_middle_price = 10000;
int house_high_price = 20000;
....
public int getHousePrice(){...}
}
生成器
abstract class HouseBuilder
{
protected House house;
protected String area;
protected String bedroom;
protected String bathroom;
protected String garage;
public void createNewHouse(){house = new House();}
....
public abstract buildArea();
public abstract buildBedroom();
public abstract buildBathroom();
public abstract buildGarage();
}
class lowHouseBuilder extends HouseBuilder
{
public void buildArea(house.setArea(area));
public void buildBedroom(){...};
public void buildBathroom(){..};
public void buildGarage(){...};
}
class middleHouseBuilder extends HouseBuilder
{
public void buildArea(house.setArea(area));
public void buildBedroom(){...};
public void buildBathroom(){..};
public void buildGarage(){...};
}
class highHouseBuilder extends HouseBuilder
{
public void buildArea(...);
public void buildBedroom(){...};
public void buildBathroom(){..};
public void buildGarage(){...};
}
director类,负责指导builder
public class Director
{
private HouseBuilder hs;
public void constructHouse()
{
hs.createNewHouse();
hs.buildArea(...);
hs.buildBedroom(){...};
hs.buildBathroom(){..};
hs.buildGarage(){...};
}
public void SetBuilder(HouseBuilder value){hs = value;}
HouseBuilder GetBuilder(){...}
House getHouse(){...}
}
---------以上是生成者模式--------
工厂类
class BuildFactory
{
public HouseBuilder getBuilder(String str)
{
HouseBuilder builder = null;
if(str.equals(...)){builder = new lowHouseBuilder ();}
...
}
}
使用:
Director dir = new Director();
dir.setBuilder(builder);
dir.constructHouse();
dir.getHouse();
总结
工厂模式可以看做是生成者模式的一个简化版本。工厂方法模式中,工厂方法负责创建一个类的不同子类对象,用户不需要知道哪个子类被创建了。在生成者模式中,生成器也使用了一个创建者方法创建不同的子类的对象,但是即使使用的是同样的子类,这些子类的对象的组合也可能不同。
通常,在初始设计的时候可以使用工厂模式,而当设计中发现需要更多的灵活性的时候,设计者可以开始考虑使用抽象工厂模式或者生成者模式。