Builder——生成器模式

一、定义

      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();
	}

}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值