Чтобы грамотно переписать фабрику в C++, рекомендуется использовать шаблон проектирования "Фабричный метод" или "Абстрактная фабрика". Оба этих шаблона позволяют создавать объекты, скрывая детали их создания и предоставляя пользователю удобный интерфейс для работы с объектами.
1. Шаблон "Фабричный метод":
- Создайте абстрактный базовый класс (интерфейс) "Продукт", определяющий общий интерфейс для всех продуктов, которые должна создавать фабрика.
- Создайте конкретные классы, реализующие интерфейс "Продукт".
- Создайте абстрактный базовый класс (интерфейс) "Фабрика", содержащий чисто виртуальный метод "СоздатьПродукт", который будет возвращать указатель на объект типа "Продукт".
- Создайте конкретные классы, реализующие интерфейс "Фабрика", и переопределите метод "СоздатьПродукт" для каждого класса так, чтобы он создавал соответствующий объект типа "Продукт".
Пример кода:
class Product { public: virtual void Use() = 0; }; class ConcreteProduct1 : public Product { public: void Use() override { // Реализация использования продукта 1 } }; class ConcreteProduct2 : public Product { public: void Use() override { // Реализация использования продукта 2 } }; class Factory { public: virtual Product* CreateProduct() = 0; }; class ConcreteFactory1 : public Factory { public: Product* CreateProduct() override { return new ConcreteProduct1(); } }; class ConcreteFactory2 : public Factory { public: Product* CreateProduct() override { return new ConcreteProduct2(); } };
2. Шаблон "Абстрактная фабрика":
- Создайте абстрактный базовый класс (интерфейс) "ПродуктА", определяющий интерфейс для первой группы продуктов.
- Создайте абстрактный базовый класс (интерфейс) "ПродуктБ", определяющий интерфейс для второй группы продуктов.
- Создайте конкретные классы, реализующие интерфейсы "ПродуктА" и "ПродуктБ".
- Создайте абстрактный базовый класс (интерфейс) "Фабрика", содержащий чисто виртуальные методы "СоздатьПродуктА" и "СоздатьПродуктБ", которые будут возвращать указатели на объекты типов "ПродуктА" и "ПродуктБ" соответственно.
- Создайте конкретные классы, реализующие интерфейс "Фабрика", и переопределите методы "СоздатьПродуктА" и "СоздатьПродуктБ" так, чтобы они создавали соответствующие объекты.
Пример кода:
class ProductA { public: virtual void UseProductA() = 0; }; class ProductB { public: virtual void UseProductB() = 0; }; class ConcreteProductA1 : public ProductA { public: void UseProductA() override { // Реализация использования продукта А1 } }; class ConcreteProductA2 : public ProductA { public: void UseProductA() override { // Реализация использования продукта А2 } }; class ConcreteProductB1 : public ProductB { public: void UseProductB() override { // Реализация использования продукта B1 } }; class ConcreteProductB2 : public ProductB { public: void UseProductB() override { // Реализация использования продукта B2 } }; class Factory { public: virtual ProductA* CreateProductA() = 0; virtual ProductB* CreateProductB() = 0; }; class ConcreteFactory1 : public Factory { public: ProductA* CreateProductA() override { return new ConcreteProductA1(); } ProductB* CreateProductB() override { return new ConcreteProductB1(); } }; class ConcreteFactory2 : public Factory { public: ProductA* CreateProductA() override { return new ConcreteProductA2(); } ProductB* CreateProductB() override { return new ConcreteProductB2(); } };
Выбор между этими двумя шаблонами зависит от контекста применения и требований проекта. Шаблон "Фабричный метод" используется, когда масштабируемость создания продуктов в пределах одной группы является приоритетом, в то время как "Абстрактная фабрика" используется, когда масштабируемость создания продуктов по нескольким группам является приоритетом.