etmBoard("AsusMb");
}
@Override
public void buildCpu() {
this.aComputer.setCpu("Intel CoreI7");
}
@Override
public void buildMemory() {
this.aComputer.setMemory("King stone DDR4");
}
@Override
public void buildHDisk() {
this.aComputer.sethDisk("West Hard Disk 1T");
}
@Override
public ComputerA getComputer() {
// TODO Auto-generated method stub
System.out.println("Box:"+this.aComputer.getBox());
System.out.println("MBoard:"+this.aComputer.getmBoard());
System.out.println("Cpu:"+this.aComputer.getCpu());
System.out.println("Memory:"+this.aComputer.getMemory());
System.out.println("HDisk:"+this.aComputer.gethDisk());
return aComputer;
}
}
public class ComputerA {
private String box;
private String mBoard;
private String cpu;
private String memory;
private String hDisk;
public ComputerA() {
super();
}
public String getBox() {
return box;
}
public void setBox(String box) {
this.box = box;
}
public String getmBoard() {
return mBoard;
}
public void setmBoard(String mBoard) {
this.mBoard = mBoard;
}
public String getCpu() {
return cpu;
}
public void setCpu(String cpu) {
this.cpu = cpu;
}
public String getMemory() {
return memory;
}
public void setMemory(String memory) {
this.memory = memory;
}
public String gethDisk() {
return hDisk;
}
public void sethDisk(String hDisk) {
this.hDisk = hDisk;
}
}
public class CDirector {
private CBuilder theCBuilder;
/**
* @roseuid 59DB89BE02A1
*/
public CDirector(CBuilder builder)
{
this.theCBuilder=builder;
}
/**
* 独立出来的构建过程
*/
public void construct()
{
this.theCBuilder.buildBox();
this.theCBuilder.buildMBoard();
this.theCBuilder.buildCpu();
this.theCBuilder.buildMemory();
this.theCBuilder.buildHDisk();
this.theCBuilder.getComputer();
}
}
public class Client {
public static void main(String[] args) {
CBuilder builder=new ComputerABuilder();
CDirector director=new CDirector(builder);
director.construct();
}
}
运行结果如下:
Box:MAtx
MBoard:AsusMb
Cpu:Intel CoreI7
Memory:King stone DDR4
HDisk:West Hard Disk 1T
五、模式的约束
对于以下情况应当使用生成器模式:
1.需要生成的产品对像有复杂的内部结构。每个内部成分可以是一个对像,也可以是产品的一个组成部分。
2.需要生产的产品的各个部件之间相互依赖,也就是一个部件的建造必须依赖另一个部件建造完成才能建造,生成器模式可以强制实行一种分步骤的建造过程。
3.在对像的创建过程中会使用到系统中的其它一些对像,这些对像在产品对像的创建过程中不易得到。
六、模式的变体与扩展
1.省略抽像生成器Builder角色,如果系统确定只会有一个具体生成器角色,那么就可以省略掉抽像生成器角色,类图如下:
2.省略指导者角色Director :如果抽像生成器Builder角色被省略,如上面的“1.”的情况,那么Director存在的意义就不大了,该角色也可以进行省略,如下图:
七、与其它模式的关系
1.生成器模式与工厂方法模式,这两个模式可以组合使用。生成器模式的Builder实现中,通常需要选择具体的部件实现。一个可行的方案就是实现为工厂方法,通常工厂方法来获取具体的部件对像,然后再进行部件的装配。
如下图:
2.生成器模式与抽像工厂模式,这两个模式是可以组合使用的,在生成器模式的Builder实现中,需要创建各个部件对像,而这些部件对像是有关联的,通常是构成的是一个复杂对像的部件对像。也就是说,Builder实现中,需要获取构成一个复杂对像的产品族,那自然就可以使用抽像工厂模式来实现,这样一来抽像工厂负责了部件对像的创建,Builder实现里面则主要负责产品对像的整体构建了。
如下图:
其实创建模式和抽像工厂模式两者还是有区别的,抽像工厂模式的主要目的是创建产品族,这个产品族里面的单个产品就相当于是构成一个复杂对像的部件对像,抽像工厂对像创建完成后就立即返回整个产品族;而生成器的模式的主要目的是按照构造算法,一步一步来构建一个复杂的产品对像,通常要等到整个构建过程结速后,才会得到最终的产品对像。
八、模式优缺点
生成器模式可以用同一个构建算法构建出表现上完全不同的产品,实现产品的构建和产品的表现上的分离。生成器模式正是把产品的构建过程独立出来,使它和具体产品的表现松散耦合,从而使得构建算法可以重用,而具体产品表现可以扩展和切换,从产品表现维度很好的支持开闭原则。