2023-01-26 20:55:28
День #10. Отчет за 25.01.2023
1. Не сегодня
2. Не пользовался электроникой в течение получаса
3. Сегодня я прочитал разницу между фабриками (Простая фабрика, фабричный метод, абстрактная фабрика). Я всегда путался между ними и решил понять разницу между ними раз и навсегда)) В общем смысле фабрика создает объекты, не предоставляя клиенту логику создания экземпляра, и ссылается на вновь созданный объект через общий интерфейс ака Умный Конструктор. Давайте пройдемся по каждому из них.
1. Простая фабрика - это класс, в котором есть один метод с большим количеством операторов switch/if, который выбирает класс для создания. Пример:
class UserFactory {
public static User create(UserType type) {
switch (type) {
case UserType.USER: return new User();
case UserType.CUSTOMER: return new Customer();
case UserType.ADMIN: return new Admin();
default:
throw new Exception("Wrong user type passed.");
}
}
}
Недостатком такого подхода является то, что для того, чтобы добавить новый класс, нам придется изменить сам класс, что нарушает Open-closed principle. Мы не можем наследовать от этого класса и добавить другой новый класс.
2. Фабричный метод - это абстрактный класс, в котором подклассы могут переопределять тип продукта, создаваемого в суперклассе. Он не только создает объекты, но и обладает другими методами. Пример:
abstract class Department {
public abstract Employee createEmployee(int id);
public void fire(int id) {
Employee employee = createEmployee(id);
employee.paySalary();
employee.dismiss();
}
}
class HRDepartment extends Department {
public Employee createEmployee(int id) {
return new HREmployee(id);
}
}
class ITDepartment extends Department {
public Employee createEmployee(int id) {
return new ITEmployee(id);
}
}
В отличие от простой фабрики, мы можем добавлять новые классы, не нарушая Open-closed principle.
3. Абстрактная фабрика предоставляет интерфейс для создания семейств взаимосвязанных или взаимозависимых объектов без указания их конкретных классов. Пример:
abstract class FurnitureFactory {
abstract public function createChair();
abstract public function createTable();
}
class VictorianFurnitureFactory extends FurnitureFactory {
public function createChair() {
return new VictorianChair();
}
public function createTable() {
return new VictorianTable();
}
}
class ModernFurnitureFactory extends FurnitureFactory {
public function createChair() {
return new ModernChair();
}
public function createTable() {
return new ModernTable();
}
}
Как вы можете видеть, абстрактная фабрика создает фабрику, которая создает семейства продуктов.
Если вы пометите обычную фабрику ключевым словом abstract, она не станет абстрактной фабрикой!))
Что я читал?
Сравнение фабрик
Design Patterns: Factory vs Factory method vs Abstract Factory
Паттерн проектирования Factory
4. Лег спать в ~01:00
42 views17:55