繁体   English   中英

Builder设计模式 - 没有抽象类/接口

[英]Builder design pattern - No abstract class/interface

我想知道我是否可以实现Builder设计模式,但没有一个接口/抽象类,从中派生出具体的构建器? 我可以只有一个建筑师吗?

如果我只有一个混凝土建造者和一个导演,它仍然是建筑师设计模式?

更加具体:

我有一些对象,我想“拼凑”到一个复杂的对象。 更精确我有以下几个类:

门墙室

我想用这些classe建立一个“世界”,这就是所有这些课程结合起来给了我一个世界。

谢谢

是的,绝对可以拥有一个简单的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从未被定义,则世界将无效。

Builder可以处理正确构建,连接和验证World创建过程的所有细节,为希望创建世界的客户端代码提供灵活性,并释放复杂构造逻辑的World对象。

您可以将构建器模式与访问者模式组合在一起:将某种数据树传递给构建器,每个数据树都实现一个accept(Visitor v)方法,并让构建器通过接受将树通过每个节点返回访问者方法。

如果我只有一个混凝土建造者和一个导演,它仍然是建筑师设计模式?

我不会在一开始就对这个问题感到困惑。 如果您的项目只需要构建一种类型的“world”,并且您实际上不需要多个构建器子类,那么使用director和单个具体构建器是一种有效的方法。 转而关注模式的精神 - 即将导演与建造世界的细节隔离开来。

一旦您的代码正常运行并且您对结果感到满意,请返回并查看您的导演和构建器之间的真实互动方式。 然后考虑重构构建器以提取一个通用接口,以真正确定导向器和构建器之间的合同。

我发现从工作的具体类中提取出一个合理的接口要容易得多,然后尝试先猜测这个接口可能是什么,并尝试同时开发接口和类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM