За последние 24 часа нас посетили 30550 программистов и 1810 роботов. Сейчас ищут 886 программистов ...

фабрика и фабричный метод

Тема в разделе "PHP для новичков", создана пользователем artemka, 15 окт 2017.

  1. artemka

    artemka Новичок

    С нами с:
    18 авг 2017
    Сообщения:
    56
    Симпатии:
    4
    Здравствуйте. Можете объяснить в чем отличия и показать пример кода где используется фабрика и фабричный метод?
    Вот мой пример, но как понял, это простоя фабрика. Вы можете мой код доработать, чтобы там было и то и то. Как я понял из слов преподавателя, это два разный паттерна.
    PHP:
    1. <?php
    2. //Создание объекта автомобиля по ключевому слову.
    3.  
    4. //Простая Фабрика. Позволяет создавать объекты без логики их создания в клиенте.
    5. //Фабричный метод. Позволяет подклассам определять какой класс инициализировать.
    6. class carFactory {
    7.  
    8.     public static function build ($type = '') {
    9.  
    10.         if($type == '') {
    11.             throw new Exception('Тип неопределен.');
    12.         } else {
    13.  
    14.             $className = 'car_'.ucfirst($type);
    15.  
    16.             if(class_exists($className)) {
    17.                 return new $className();
    18.             } else {
    19.                 throw new Exception('Тип машины не определен.');
    20.             }
    21.         }
    22.     }
    23. }
    24.  
    25.  
    26. class car_Sedan {
    27.  
    28.     public function __construct() {
    29.         echo "Создание седана<br>";
    30.     }
    31.  
    32. }
    33.  
    34. class car_Suv {
    35.  
    36.     public function __construct() {
    37.         echo "Создание SUV<br>";
    38.     }
    39.  
    40. }
    41.  
    42. class car_Cabri {
    43.  
    44.     public function __construct() {
    45.         echo "Создание кабриолета<br>";
    46.     }
    47.  
    48. }
    49.  
    50.  
    51. $sedan = carFactory::build('sedan');
    52.  
    53. $suv = carFactory::build('suv');
    54.  
    55. $luxury = carFactory::build('cabri');
    56.  
    57.  
    58. ?>
    я его взял тут: https://ruseller.com/lessons.php?rub=37&id=2290
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.817
    Симпатии:
    1.333
    Адрес:
    Лень
    фабрика - это придуманное место, где свинья кормит Поповичей говнокодом.

    А по сути это
    PHP:
    1. <?php
    2.  
    3. error_reporting ( E_ALL );
    4.  
    5. function autoload( string $C )
    6. {
    7.     if ( file_exists ( sprintf ( '%s/%s.php', __DIR__, $C ) ) )
    8.     {
    9.         $C = sprintf ( '%s/%s.php', __DIR__, $C );
    10.     }
    11.     else throw new \Exception( sprintf ( 'Invalid namespace %s', $C ) );
    12.    
    13.     include strtr ( $C, '\\', DIRECTORY_SEPARATOR ) . '.php';
    14. }
    15.  
    16. spl_autoload_register ( 'autoload' );
    17.  
    18. /* все */
    19.  
    20. $lol = lalka::you( 'HI' ); # вызывает класс lalka / юзается spl_autoload_register / ищем файл lalka.php в данной папке
    21.  
    22. На всякий подскажет ошибка 'Invalid namespace
     
  3. artemka

    artemka Новичок

    С нами с:
    18 авг 2017
    Сообщения:
    56
    Симпатии:
    4
    ну я не объясню так преподавателю. Вы можете мой код поправить и рассказать что да как?

     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.599
    Симпатии:
    1.764
    @artemka, если вы вынесете создания в отдельный класс CarsFactory, будет фабрика. А вообще, если есть преподаватель, почему вы ему этот вопрос не зададите?
    --- Добавлено ---
    @MouseZver, автолоадер - это не фабрика, это автолоадер.
     
  5. artemka

    artemka Новичок

    С нами с:
    18 авг 2017
    Сообщения:
    56
    Симпатии:
    4
    он сказал на самообучение. Вы можете мой код поправить и рассказать что да как?
     
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.599
    Симпатии:
    1.764
    А, так я не внимательно посмотрел. Это у вас как раз фабрика. https://refactoring.guru/ru/design-patterns/factory-comparison - вот, почитайте. Вообще, не знаю, что имел в виду ваш преподаватель, но понятия пересекаются. Почитайте также книжку Мэтта Зандстры
     
    [vs] нравится это.
  7. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    @artemka у тебя есть класс-фабрика. А фабричный метод - это когда под фабрику выделен не целый класс, а один метод в классе. При чем все объекты, которые производит фабричный метод, должны относиться к классу-наследнику.
    Простой (но бестолковый) вариант:
    PHP:
    1. namespace Cars;
    2. class Car {
    3.  
    4.   public $wheels = 4;
    5.  
    6.   public static function make($class) {
    7.     return new $class;
    8.   }
    9. }
    10.  
    11. class Sedan extends Car
    12. {
    13.   public $color = 'silver';
    14. }
    15.  
    16. class Suv extends Car
    17. {
    18.   public $color = 'black';
    19. }
    20.  
    21. print_r(Car::make('Cars\Sedan'));
    22. print_r(Car::make('Cars\Suv'));
     
    Dimon2x нравится это.
  8. artemka

    artemka Новичок

    С нами с:
    18 авг 2017
    Сообщения:
    56
    Симпатии:
    4
    т.е. как я понял, тот пример, который я привел это фабричный метод. да?
     
  9. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.599
    Симпатии:
    1.764
    @artemka, нет, у Вас простая фабрика. Вы по ссылке прочитали?
     
  10. artemka

    artemka Новичок

    С нами с:
    18 авг 2017
    Сообщения:
    56
    Симпатии:
    4
    а вы можете из этой простой фабрики сделать фабричный метод (из моего примера)?
     
  11. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.599
    Симпатии:
    1.764
    Вы буковки прочитайте :) По ссылке. Что за проблема сейчас почти у всех, кто здесь спрашивает что-то, с пониманием русского языка? Фабричный метод другую задачу решает. https://refactoring.guru/ru/design-patterns/factory-method
     
  12. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    По ссылке пример как раз абстрактная фабрика с фабричным методом. ))
     
  13. artemka

    artemka Новичок

    С нами с:
    18 авг 2017
    Сообщения:
    56
    Симпатии:
    4
    а можете еще привести пример фабричного мотода?
     
  14. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    @artemka, по ссылке выше вроде все очень хорошо расписано
    --- Добавлено ---
    и примеры тоже есть.
     
  15. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    @artemka что такое метод?
     
  16. artemka

    artemka Новичок

    С нами с:
    18 авг 2017
    Сообщения:
    56
    Симпатии:
    4
    ну я прошу, вы можете из этого что я скинул, сделать фабричный метод? я не до конца понимаю так, я уже 3 раз пишу, а вы все равно свое
     
  17. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.599
    Симпатии:
    1.764
    Потому что этот раздел не называется "Сделайте за меня".
     
  18. artemka

    artemka Новичок

    С нами с:
    18 авг 2017
    Сообщения:
    56
    Симпатии:
    4
    Понятно
     
  19. artemka

    artemka Новичок

    С нами с:
    18 авг 2017
    Сообщения:
    56
    Симпатии:
    4
    Вот что у меня вышло
    PHP:
    1. //Абстрактный "создатель"
    2. interface CarFactory {
    3.     public function makeCar(); // фабр. метод
    4. }
    5.  
    6. //Абстрактный "продукт"
    7. interface Car {
    8.     public function getType();// здесь может быть какой угодно набор методов
    9. }
    10.  
    11. // Реализации абстракций создателя и продукта
    12.  
    13. //  конкретный "создатель" - фабрика кузовов типа "сидан"
    14. class SedanFactory implements CarFactory {
    15.     // конкретная реалзизация фабричного метода makeCar()
    16.     public function makeCar() {  // создаём кузов
    17.         return new Sedan();
    18.     }
    19. }
    20.  
    21. // конкретный продукт (кузов машины типа "сидан")
    22. class Sedan implements Car {
    23.     public function getType() { // например возврат конкретного типа
    24.         return 'Sedan';
    25.     }
    26. }
    27.  
    28.  
    29. $factory = new SedanFactory(); // создаём фабрику
    30. $car = $factory->makeCar(); // вызываем фабричный метод и получаем машину (кузов)
    31. print $car->getType();