C++一分钟之-设计模式:工厂模式与抽象工厂

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 【7月更文挑战第14天】设计模式是解决软件设计问题的通用方案。工厂模式与抽象工厂模式是创建型模式,用于对象创建而不暴露创建逻辑。工厂模式推迟实例化到子类,但过度使用会增加复杂性。抽象工厂则创建相关对象族,但过度抽象可能造成不必要的复杂度。两者均应按需使用,确保设计灵活性。代码示例展示了C++中如何实现这两种模式。

在软件工程中,设计模式是一种通用的解决方案,用于解决常见的设计问题。工厂模式和抽象工厂模式是创建型设计模式中的两个重要成员,它们帮助我们创建对象而不需要暴露创建逻辑,同时使系统在不修改现有代码的情况下可以扩展。
image.png

工厂模式

工厂模式的核心思想是定义一个创建产品对象的接口,但是让子类决定实例化哪一个类。这样,工厂方法使一个类的实例化延迟到其子类。

常见问题与易错点

  1. 过度使用:在不需要的地方使用工厂模式会导致代码复杂度增加,维护成本上升。
  2. 违反开闭原则:当需要添加新产品时,可能需要修改现有的工厂类,这违反了“对扩展开放,对修改关闭”的原则。

如何避免

  • 仅在需要动态选择具体实现或需要解耦创建过程时使用工厂模式。
  • 使用抽象工厂模式来进一步封装创建过程,减少对工厂类的修改。

代码示例

#include <iostream>

// 抽象产品
class Product {
   
   
public:
    virtual void Operation() const = 0;
};

// 具体产品A
class ConcreteProductA : public Product {
   
   
public:
    void Operation() const override {
   
   
        std::cout << "ConcreteProductA operation." << std::endl;
    }
};

// 具体产品B
class ConcreteProductB : public Product {
   
   
public:
    void Operation() const override {
   
   
        std::cout << "ConcreteProductB operation." << std::endl;
    }
};

// 工厂
class Factory {
   
   
public:
    virtual Product* CreateProduct() = 0;
};

// 具体工厂A
class ConcreteFactoryA : public Factory {
   
   
public:
    Product* CreateProduct() override {
   
   
        return new ConcreteProductA();
    }
};

// 具体工厂B
class ConcreteFactoryB : public Factory {
   
   
public:
    Product* CreateProduct() override {
   
   
        return new ConcreteProductB();
    }
};

int main() {
   
   
    Factory* factory = new ConcreteFactoryA();
    Product* product = factory->CreateProduct();
    product->Operation();
    delete product;
    delete factory;
    return 0;
}

抽象工厂模式

抽象工厂模式提供了一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们具体的类。它比工厂模式更进一步,允许创建整个产品族。

常见问题与易错点

  1. 过度抽象:如果产品族之间的关系并不紧密,过度使用抽象工厂可能导致不必要的复杂性。
  2. 缺乏灵活性:一旦定义了产品族,很难在运行时更改或扩展。

如何避免

  • 在产品族之间有明确的关系,并且需要一起创建时使用抽象工厂。
  • 确保设计足够灵活,以便在不影响其他部分的情况下添加新的产品族。

代码示例

#include <iostream>

// 抽象产品A
class AbstractProductA {
   
   
public:
    virtual void InterfaceA() const = 0;
};

// 具体产品A1
class ConcreteProductA1 : public AbstractProductA {
   
   
public:
    void InterfaceA() const override {
   
   
        std::cout << "ConcreteProductA1 interface." << std::endl;
    }
};

// 具体产品A2
class ConcreteProductA2 : public AbstractProductA {
   
   
public:
    void InterfaceA() const override {
   
   
        std::cout << "ConcreteProductA2 interface." << std::endl;
    }
};

// 抽象产品B
class AbstractProductB {
   
   
public:
    virtual void InterfaceB() const = 0;
};

// 具体产品B1
class ConcreteProductB1 : public AbstractProductB {
   
   
public:
    void InterfaceB() const override {
   
   
        std::cout << "ConcreteProductB1 interface." << std::endl;
    }
};

// 具体产品B2
class ConcreteProductB2 : public AbstractProductB {
   
   
public:
    void InterfaceB() const override {
   
   
        std::cout << "ConcreteProductB2 interface." << std::endl;
    }
};

// 抽象工厂
class AbstractFactory {
   
   
public:
    virtual AbstractProductA* CreateProductA() = 0;
    virtual AbstractProductB* CreateProductB() = 0;
};

// 具体工厂1
class ConcreteFactory1 : public AbstractFactory {
   
   
public:
    AbstractProductA* CreateProductA() override {
   
   
        return new ConcreteProductA1();
    }
    AbstractProductB* CreateProductB() override {
   
   
        return new ConcreteProductB1();
    }
};

// 具体工厂2
class ConcreteFactory2 : public AbstractFactory {
   
   
public:
    AbstractProductA* CreateProductA() override {
   
   
        return new ConcreteProductA2();
    }
    AbstractProductB* CreateProductB() override {
   
   
        return new ConcreteProductB2();
    }
};

int main() {
   
   
    AbstractFactory* factory = new ConcreteFactory1();
    AbstractProductA* productA = factory->CreateProductA();
    AbstractProductB* productB = factory->CreateProductB();
    productA->InterfaceA();
    productB->InterfaceB();
    delete productA;
    delete productB;
    delete factory;
    return 0;
}

通过以上示例,我们可以看到工厂模式和抽象工厂模式如何帮助我们在C++中更好地管理对象的创建过程,同时保持代码的清晰和可维护性。

目录
相关文章
|
2月前
|
设计模式 Java
【设计模式】工厂模式(定义 | 特点 | Demo入门讲解)
【设计模式】工厂模式(定义 | 特点 | Demo入门讲解)
56 2
|
3月前
|
设计模式
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
这篇文章详细解释了工厂模式,包括简单工厂、工厂方法和抽象工厂三种类型。每种模式都通过代码示例展示了其应用场景和实现方法,并比较了它们之间的差异。简单工厂模式通过一个工厂类来创建各种产品;工厂方法模式通过定义一个创建对象的接口,由子类决定实例化哪个类;抽象工厂模式提供一个创建相关或依赖对象家族的接口,而不需要明确指定具体类。
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
|
4月前
|
设计模式 Java
Java 设计模式之谜:工厂模式与抽象工厂模式究竟隐藏着怎样的神奇力量?
【8月更文挑战第30天】在Java编程中,设计模式为常见问题提供了高效解决方案。工厂模式与抽象工厂模式是常用的对象创建型设计模式,能显著提升代码的灵活性、可维护性和可扩展性。工厂模式通过定义创建对象的接口让子类决定实例化哪个类;而抽象工厂模式则进一步提供了一个创建一系列相关或相互依赖对象的接口,无需指定具体类。这种方式使得系统更易于扩展和维护。
43 1
|
4月前
|
设计模式 算法 开发者
深入理解工厂模式与策略模式:设计模式的灵活应用
深入理解工厂模式与策略模式:设计模式的灵活应用
|
4月前
|
设计模式 uml C语言
设计模式----------工厂模式之简单工厂模式(创建型)
这篇文章详细介绍了简单工厂模式,包括其定义、应用场景、UML类图、通用代码实现、运行结果、实际应用例子,以及如何通过反射机制实现对象创建,从而提高代码的扩展性和维护性。
设计模式----------工厂模式之简单工厂模式(创建型)
|
4月前
|
设计模式 uml
设计模式-------------工厂模式之工厂方法模式(创建型)
工厂方法模式是一种创建型设计模式,它通过定义一个用于创建对象的接口,让子类决定实例化哪一个类,从而实现类的实例化推迟到子类中进行,提高了系统的灵活性和可扩展性。
|
4月前
|
设计模式 Java C语言
设计模式-----------工厂模式之抽象工厂模式(创建型)
抽象工厂模式是一种创建型设计模式,它提供了一个接口用于创建一系列相关或相互依赖的对象,而无需指定具体类,从而增强了程序的可扩展性并确保客户端只使用同一产品族的产品。
设计模式-----------工厂模式之抽象工厂模式(创建型)
|
5月前
|
设计模式 安全 C++
C++一分钟之-C++中的设计模式:单例模式
【7月更文挑战第13天】单例模式确保类只有一个实例,提供全局访问。C++中的实现涉及线程安全和生命周期管理。基础实现使用静态成员,但在多线程环境下可能导致多个实例。为解决此问题,采用双重检查锁定和`std::mutex`保证安全。使用`std::unique_ptr`管理生命周期,防止析构异常和内存泄漏。理解和正确应用单例模式能提升软件的效率与可维护性。
62 2
|
5月前
|
设计模式 安全 Java
Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
80 1
|
27天前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式