Как преобразовать эту простую фабрику в фабричный метод? - PullRequest
0 голосов
/ 04 ноября 2011

Я задал вопрос "Это правильный шаблон фабричного метода?" Это правильный шаблон фабричного метода?

и ... затем ... задали тот же вопрос на codereview.stackexchange.com в соответствии с рекомендацией комментатора. https://codereview.stackexchange.com/questions/5752/is-this-correct-factory-method-pattern

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

Продолжая читать другие примеры в Интернете, я начинаю думать, что мой код на самом деле простая фабрика.

Мой код:

https://codereview.stackexchange.com/questions/5752/is-this-correct-factory-method-pattern

Как мне преобразовать мой код в шаблон фабричного метода?

1 Ответ

1 голос
/ 04 ноября 2011

Вы на самом деле используете простую фабрику в своем примере, и она выглядит хорошо для меня.С этими требованиями нет необходимости использовать шаблон фабричного метода.

Однако я попытаюсь объяснить фабричный метод в этом контексте.По определению:

Шаблон метода фабрики определяет интерфейс для создания объекта, но пусть подклассы решают, какой класс создать.Фабричный метод позволяет классу откладывать создание экземпляров для подклассов.

Таким образом, в основном у вас будет абстрактный фабричный класс, который определяет, какие творческие методы будут доступны на конкретных фабриках, и последний будет решать, какие конкретные объекты создавать.

Есть один пример, который я могу вспомнить в вашем сценарии.Допустим, у вас есть Drivables разных марок (скажем, BMW и Honda).Таким образом, у вас будут классы типа BMWCoupeDrivable, BMWMotorcycleDrivable, BMWSedanDrivable, HondaCoupeDrivable, HondaMotorcycleDrivable, HondaSedanDrivable.Вы также можете добавить больше марок в будущем.В этом случае вам, вероятно, лучше использовать фабричный метод.

    abstract class DriveableFactory
    {
        abstract public function create($numberOfPeople);

        //-- Other methods here which manipulate the drivable
        //-- e.g. testDrive()
    }

    class BMWDriveableFactory extends DriveableFactory
    {
        public function create($numberOfPeople){

            if( $numberOfPeople == 1 )
            {
                return new BMWMotorcycleDriveable;
            }       
            elseif( $numberOfPeople == 2 )
            {
                return new BMWCoupleDriveable;
            }
            elseif( $numberOfPeople >= 3 && $numberOfPeople < 4)
            {
                return BMWSedanDriveable;
            }
        }
    }

    class HondaDriveableFactory extends DriveableFactory
    {
        public function create($numberOfPeople){

            if( $numberOfPeople == 1 )
            {
                return new HondaMotorcycleDriveable;
            }       
            elseif( $numberOfPeople == 2 )
            {
                return new HondaCoupleDriveable;
            }
            elseif( $numberOfPeople >= 3 && $numberOfPeople < 4)
            {
                return HondaSedanDriveable;
            }
        }
    }

Для лучшего объяснения я бы предложил прочитать Head First Design Pattern.

...