Здравствуйте. Можете объяснить в чем отличия и показать пример кода где используется фабрика и фабричный метод? Вот мой пример, но как понял, это простоя фабрика. Вы можете мой код доработать, чтобы там было и то и то. Как я понял из слов преподавателя, это два разный паттерна. PHP: <?php //Создание объекта автомобиля по ключевому слову. //Простая Фабрика. Позволяет создавать объекты без логики их создания в клиенте. //Фабричный метод. Позволяет подклассам определять какой класс инициализировать. class carFactory { public static function build ($type = '') { if($type == '') { throw new Exception('Тип неопределен.'); } else { $className = 'car_'.ucfirst($type); if(class_exists($className)) { return new $className(); } else { throw new Exception('Тип машины не определен.'); } } } } class car_Sedan { public function __construct() { echo "Создание седана<br>"; } } class car_Suv { public function __construct() { echo "Создание SUV<br>"; } } class car_Cabri { public function __construct() { echo "Создание кабриолета<br>"; } } $sedan = carFactory::build('sedan'); $suv = carFactory::build('suv'); $luxury = carFactory::build('cabri'); ?> я его взял тут: https://ruseller.com/lessons.php?rub=37&id=2290
фабрика - это придуманное место, где свинья кормит Поповичей говнокодом. А по сути это PHP: <?php error_reporting ( E_ALL ); function autoload( string $C ) { if ( file_exists ( sprintf ( '%s/%s.php', __DIR__, $C ) ) ) { $C = sprintf ( '%s/%s.php', __DIR__, $C ); } else throw new \Exception( sprintf ( 'Invalid namespace %s', $C ) ); include strtr ( $C, '\\', DIRECTORY_SEPARATOR ) . '.php'; } spl_autoload_register ( 'autoload' ); /* все */ $lol = lalka::you( 'HI' ); # вызывает класс lalka / юзается spl_autoload_register / ищем файл lalka.php в данной папке На всякий подскажет ошибка 'Invalid namespace
@artemka, если вы вынесете создания в отдельный класс CarsFactory, будет фабрика. А вообще, если есть преподаватель, почему вы ему этот вопрос не зададите? --- Добавлено --- @MouseZver, автолоадер - это не фабрика, это автолоадер.
А, так я не внимательно посмотрел. Это у вас как раз фабрика. https://refactoring.guru/ru/design-patterns/factory-comparison - вот, почитайте. Вообще, не знаю, что имел в виду ваш преподаватель, но понятия пересекаются. Почитайте также книжку Мэтта Зандстры
@artemka у тебя есть класс-фабрика. А фабричный метод - это когда под фабрику выделен не целый класс, а один метод в классе. При чем все объекты, которые производит фабричный метод, должны относиться к классу-наследнику. Простой (но бестолковый) вариант: PHP: namespace Cars; class Car { public $wheels = 4; public static function make($class) { return new $class; } } class Sedan extends Car { public $color = 'silver'; } class Suv extends Car { public $color = 'black'; } print_r(Car::make('Cars\Sedan')); print_r(Car::make('Cars\Suv'));
Вы буковки прочитайте По ссылке. Что за проблема сейчас почти у всех, кто здесь спрашивает что-то, с пониманием русского языка? Фабричный метод другую задачу решает. https://refactoring.guru/ru/design-patterns/factory-method
ну я прошу, вы можете из этого что я скинул, сделать фабричный метод? я не до конца понимаю так, я уже 3 раз пишу, а вы все равно свое
Вот что у меня вышло PHP: //Абстрактный "создатель" interface CarFactory { public function makeCar(); // фабр. метод } //Абстрактный "продукт" interface Car { public function getType();// здесь может быть какой угодно набор методов } // Реализации абстракций создателя и продукта // конкретный "создатель" - фабрика кузовов типа "сидан" class SedanFactory implements CarFactory { // конкретная реалзизация фабричного метода makeCar() public function makeCar() { // создаём кузов return new Sedan(); } } // конкретный продукт (кузов машины типа "сидан") class Sedan implements Car { public function getType() { // например возврат конкретного типа return 'Sedan'; } } $factory = new SedanFactory(); // создаём фабрику $car = $factory->makeCar(); // вызываем фабричный метод и получаем машину (кузов) print $car->getType();