一、定义
GOF上对生成器模式的意图如此描述:将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示。
具体来说,生成器模式将一个复杂对象的构造逻辑从其代码中分离出来。这种做法在有些情况是很有用的,例如当一个类的规模很
大,我们可能希望减少其规模;又如,构造器方法的参数只能逐步获取,我们希望一步一步地构造目标对象,如对象属性需要从XML文
件中解析出来,我们希望解析出所有必须的属性后才进行对象的构造,若某项属性缺失则表示构造的是无效对象,这时我们就可以使用
生成器模式。
二、场景设计
有时候一个复杂对象的组件可能有多套,如构造迷宫的例子中,迷宫中可能有带有炸弹的组件BombedXXX,有带有咒语的组件EnchantXXX。为了让构造一个迷宫的算法可以独立于其组成部分的构造以及装配方式,生成器模式就可以排上用场。
三、类图
参与者:
Builder——为创建一个Product对象的各个部件指定抽象接口。
ConcreteBuilder——实现Builder的接口以构造和装配该产品的各个部件;提供一个检索产品的的方法(GetResult)
Director——构造一个使用Builder接口的对象
Product——表示被构造的复杂对象。包含定义组成部件的类,包含将这些部件装配成最终产品的接口。
四、代码示例
Maze.java 这个类在我代码里是空的,只是为了体现框架
public class Maze {
}
MazeBuilder.java 生成器超类
public abstract class MazeBuilder {
public void buildMaze()
{
}
public void buildRoom(int num)
{
}
public void buildDoor(int roomFrom,int roomTo)
{
}
public Maze getMaze()
{
return null;
}
}
CountingMazeBuilder.java 具体生成器类,只是这里的功能是统计组件个数
public class CountingMazeBuilder extends MazeBuilder {
private int doors;
private int rooms;
public CountingMazeBuilder()
{
this.doors=0;
this.rooms=0;
}
@Override
public void buildRoom(int num) {
this.rooms++;
}
@Override
public void buildDoor(int roomFrom, int roomTo) {
this.doors++;
}
public void getCount()
{
System.out.println("Rooms: "+this.rooms+" Doors: "+this.doors);
}
}
MazeGame.java Director类,createMaze方法利用Builder对象来构造迷宫
public class MazeGame {
public Maze createMaze(MazeBuilder builder)
{
builder.buildMaze();
builder.buildRoom(1);
builder.buildRoom(2);
builder.buildDoor(1, 2);
return builder.getMaze();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
MazeGame game=new MazeGame();
CountingMazeBuilder builder=new CountingMazeBuilder();
game.createMaze(builder);
builder.getCount();
}
}