我想知道是否可以实现建造者设计模式,但不需要从接口/抽象类中派生具体构建者?我只能有一个构建者吗?
如果我只有一个具体构建者和一个指导者,这仍然是建造者设计模式吗?
更具体地说:
我有一些对象,我想将它们组合成一个复杂的对象。更精确地说,我有以下类:
门 墙 房间
我想通过这些类来构建一个“世界”,也就是说,所有这些类组合起来给我一个世界。
谢谢
我想知道是否可以实现建造者设计模式,但不需要从接口/抽象类中派生具体构建者?我只能有一个构建者吗?
如果我只有一个具体构建者和一个指导者,这仍然是建造者设计模式吗?
更具体地说:
我有一些对象,我想将它们组合成一个复杂的对象。更精确地说,我有以下类:
门 墙 房间
我想通过这些类来构建一个“世界”,也就是说,所有这些类组合起来给我一个世界。
谢谢
是的,绝对可以拥有一个简单的WorldBuilder,其工作是创建由门、墙和房间组成的完全配置的世界。当您不想公开部分构建的、可能无效的World对象时,这非常有用。
假设使用该构建器的方式如下:
WorldBuilder builder = new WorldBuilder();
// read the definition of a room from an XML file or other source.
// this is vastily simplified, you'd probably be iteration
// something like this:
//
// for each Room in file
// for each wall in room
// for each door in wall
//
roomId = readRoomId();
wallId = readWallId();
doorId = readDoorId();
destRoomId = readDestinationRoomId();
builder.AddRoom(roomId);
builder.AddWallToRoom(roomId, wallId, SIDE.NORTH);
builder.AddDoorToWall(wallId, DOORSTYLE.WOODEN | DOORSTYLE.LOCKED, destRoomId);
// etc, etc
World world = builder.makeWorld();
Door door = new Door(roomOne, roomTwo);
但是,如果您像以前一样从文件中迭代每个房间,则可能没有对第二个房间的引用,因为它可能尚未到达。
另一种方法是仅给每个对象其相邻对象或父对象的ID,因此您可以得到以下内容,这使您可以引用尚未加载的对象:
Door door = new Door(roomOneId, roomTwoId);
但是,如果文件中出现错误,房间2从未定义,则世界将无效。
构建器可以处理正确构建、连接和验证世界创建过程的所有细节,为希望创建世界的客户端代码提供灵活性,并减轻世界对象复杂构建逻辑的压力。
accept(Visitor v)
方法,并让构建器遍历整棵树,通过accept方法将每个节点传递回访问者中。