Есть ли альтернатива переключению в заводском методе? - PullRequest
6 голосов
/ 09 августа 2011

Я вижу это довольно часто, и мне было интересно, есть ли способ так хорошо провести рефакторинг, чтобы избежать массивного переключения? Это метод фабрики: 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 ]

4 голосов
/ 09 августа 2011

Видя, как вы используете хак для обеспечения функциональности перечисления - почему бы вам не добавить метод к вашему перечислению:

public static const ROOMONE : LocationType = new LocationType("locationone", 
    function(...) : RoomController { 
        return new RoomOneController
    }
);

(извините за любые глупые ошибки - Actionscript не мой родной язык!)

В Java я бы сделал то же самое с:

public enum LocationType {
    ROOMONE {
        @Override 
        public RoomController getRoomController() {
            return new RoomOneController();
        }
    };
    public abstract RoomController getRoomController();
}
3 голосов
/ 11 августа 2011

Короткий ответ, фабрики переключаются, вот что они делают - вся суть этого стиля фабрики заключается в том, чтобы централизовать логику построения в одном месте, а не засыпать ее вокруг кодовой базы.

Пока вы не используете Static Factory и не пишете код для интерфейса IRoomControllerFactory, тогда вы получаете все обычные преимущества ООП - его замена во время выполнения / для тестирования - после всего, что вы говорите: «Yo RoomControllerFactory, дайте мне место для этого магического идентификатора! '

В качестве дополнительного ответа на ваш вопрос, вы можете спросить себя, зачем вам так много конкретных примеров RoomController? Возможно, отдав предпочтение композиции перед наследованием, вы могли бы реорганизовать вещи, чтобы использовать вместо них Builder?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...