我看到了很多,我想知道是否有一种方法可以很好地重构这个以避免大规模切换?这是工厂中的一种方法:RoomControllerFactory,根据其类型实例化游戏位置。以下是工厂方法中的开关示例:
switch (location.getType())
{
case Location.ROOMONE:
return new RoomOneController(location, data, view);
case Location.ROOMTWO:
return new RoomTwoController(location, data, view);
case Location.ROOMTHREE:
return new RoomThreeController(location, data, view);
答案 0 :(得分:4)
看到你正在使用hack来提供枚举功能 - 为什么不在你的枚举中添加一个方法:
public static const ROOMONE : LocationType = new LocationType("locationone",
function(...) : RoomController {
return new RoomOneController
}
);
(原谅任何愚蠢的错误 - 动作脚本不是我的第一语言!)
在java中,我会这样做:
public enum LocationType {
ROOMONE {
@Override
public RoomController getRoomController() {
return new RoomOneController();
}
};
public abstract RoomController getRoomController();
}
答案 1 :(得分:3)
简短的回答,工厂转换,这就是他们所做的 - 这种工厂风格的重点是将构造逻辑集中到一个地方,而不是让它遍布代码库。
只要你没有使用静态工厂和编码到IRoomControllerFactory接口,那么你就可以获得在运行时交换他/进行测试的所有常规OOP好处 - 毕竟你说'Yo RoomControllerFactory,给我一个这个魔术标识符的空间!'
作为对您问题的进一步回答,您可能想问问自己为什么需要这么多RoomController的具体实例?也许通过支持组合而不是继承,你可以重构一些东西而不是使用Builder?