Чета за шаблон на фабричен метод и проста фабрика. оказва се Както мога да разбера, простата фабрика е достатъчна и не виждам случая на използване на фабричния метод шаблон. Моля, прочетете тази връзка, https://www.binpress.com/factory-design-pattern/ и ще задам въпросите си.
1) в проста фабрика казва, че е лошо, защото нарушава принципа отворен/затворен. Разбирам това, но във фабричния модел на метода това, което направи, все още нарушава принципа отворен/затворен.
if ('car'==$toyName) {
$toy = new NyCar();
} else if ('helicopter'==$toyName) {
$toy = new NyHelicopter();
}
Ако ще има нова игра за Ню Йорк, трябва да я добавим тук.
2) след като прочете връзката, преди действително да достигне до по-доброто решение, използва следния код. :
class NySimpleFactory {
public function createToy($toyName) {
$toy = null;
if ('car'==$toyName) {
$toy = new NyCar();
} else if ('helicopter'==$toyName) {
$toy = new NyHelicopter();
}
return $toy;
}
}
class NyToysFactory {
public $simpleFactory;
public function __construct(SimpleFactory $simpleFactory) {
$this->simpleFactory = $simpleFactory;
}
public function produceToy($toyName) {
$toy = null;
$toy = $this->simpleFactory->createToy($toyName);
$toy->prepare();
$toy->package();
$toy->label();
return $toy;
}
}
Тогава се казва,
Разработчиците завършват бързо новия код и го предават на фабриките в САЩ. След две седмици телефонът започва да звъни в офиса на разработчиците, защото фабриката в Ню Йорк е имала производствени проблеми. Оказва се, че класът NyToysFactory е модифициран от разработчиците в отдалечения клон, защото персоналът не иска да извършва работа по опаковане и етикетиране. Те модифицираха produceToy(), като премахнаха функциите label() и package().
Изглежда, че Simple Factory няма да работи в този сценарий. Не искаме клоновете в САЩ да могат да променят функциите produceToy(). ProduceToy() трябва да се състои от набор от стандартни процедури и клоновете трябва да отговарят само за създаването на специфични за местоположение играчки. Ами ако могат да създадат абстрактен клас? А абстрактният клас, който те създават, ще има конкретен метод produceToy(), който ще имплементира набор от стандартни оперативни процедури, които всички клонове трябва да следват. Вътре в produceToy(), той извиква свой собствен абстрактен метод createToy(), за да получи клас играчка. По този начин createToy() може да капсулира създаването на обект и тъй като е абстрактен, делегира създаването на своите подкласове.
Въпросът е: а) Какво означава предаването на заводите в САЩ? b) или Не искаме клоновете в САЩ да могат да променят функциите produceToy(). те все още могат да променят функцията produceToy, каква разлика има изобщо дали не могат или могат да я променят? Просто не разбирам защо простата фабрика изобщо беше лоша за следния пример.
Няма нужда да четете за абстрактната фабрика на тази връзка