Есть реализация фабричного метода:
interface Interviewer
{
public function askQuestions();
}
class Developer implements Interviewer
{
public function askQuestions()
{
echo 'Спросить о шаблонах проектирования';
}
}
class CommunityExecutive implements Interviewer
{
public function askQuestions()
{
echo 'Спросить об общественном строительстве';
}
}
abstract class HiringManager
{
// Factory method
abstract public function makeInterviewer(): Interviewer;
public function takeInterview()
{
$interviewer = $this->makeInterviewer();
$interviewer->askQuestions();
}
}
class DevelopmentManager extends HiringManager
{
public function makeInterviewer(): Interviewer
{
return new Developer();
}
}
class MarketingManager extends HiringManager
{
public function makeInterviewer(): Interviewer
{
return new CommunityExecutive();
}
}
После чего можно использовать:
$devManager = new DevelopmentManager();
$devManager->takeInterview(); // Спросить о шаблонах проектирования
$marketingManager = new MarketingManager();
$marketingManager->takeInterview(); // Спросить об общественном строительстве
Но я могу и так использовать:
$developer = new Developer();
developer.askQuestions() // Спросить о шаблонах проектирования
$сommunityExecutive = new CommunityExecutive();
сommunityExecutive.askQuestions()//Спросить об общественном строительстве
т.к и Developer и CommunityExecutive реализуют один интерфейс. Тогда зачем мне писать эту большую конструкцию с фабричным методом?
Если быть точным, то в вашем примере используется не фабричный метод а AbstractFactory
. Но не суть.
Есть несколько преимуществ использования данного шаблона по сравнению с созданием объекта напрямую через new
.
new CommunityExecutive()
на new Developer()
в одном месте void doSmth(String name, int age, String city){
Person p = new GoodPerson(name, age, city);
}
Или так:
void doSmth(GoodPersonFactory factory){
Person p = factory.create();
}
interface PizzeriaFactory{
Pizza createPizza(Ingredients ingredients);
Ingredients createIngredients();
}
class ItalianPizzeriaFactory{
Pizza createPizza(Ingredients ingredients){
return new ItalianPizza(ingredients)
}
Ingredients createIngredients(){
return new ItalianIngredients(SHEESE, TOMATO, SALADE)
}
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Разрабатываю RESTful API на фреймворке Yii2На данный момент делаю вторую версию API v2
Доброго времени суток Подскажите пожалуйста как добавить image в Анонсы элемента? Я делаю так: