是否可以选择切换工厂方法?

时间:2011-08-09 08:05:46

标签: actionscript-3 design-patterns refactoring

我看到了很多,我想知道是否有一种方法可以很好地重构这个以避免大规模切换?这是工厂中的一种方法: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);

2 个答案:

答案 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?