2023-6-11-第二式抽象工厂模式

简介: 2023-6-11-第二式抽象工厂模式

😉一、基础概念

抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。

在抽象工厂模式中,客户端通过调用抽象工厂接口中的方法来创建一系列相关的产品对象。这些产品对象都是由具体的工厂类来创建的,每个具体工厂类都负责创建一组特定的产品。

抽象工厂模式的优点是可以保证客户端始终只使用同一组产品,而不会出现不兼容的情况。此外,通过使用抽象工厂模式,可以使客户端与具体产品的实现相分离,从而使系统更加灵活,易于扩展和维护。

在抽象工厂模式中,抽象产品 (AbstractProduct) 可能是一个或多个,从而构成一个或多个产品族(Product Family)。 在只有一个产品族的情况下,抽象工厂模式实际上退化到工厂方法模式。


🐱‍🐉二、抽象工厂模式实现

工厂方法模式:一个抽象产品类,可以派生出多个具体产品类。每个具体工厂类只能创建一个具体产品类的实例。

抽象工厂模式:多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。一个抽象工厂类可以派生出多个具体工厂类。每个具体工厂类可以创建多个具体产品的实例。

区别:工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。

首先,定义抽象产品类 AbstractProduct,它包含了产品的公共方法:

class AbstractProduct {
public:
    virtual void operation() = 0;
    virtual ~AbstractProduct() {}
};

然后,定义具体产品类 ConcreteProductAConcreteProductB,它们实现了抽象产品接口,具体实现了产品的方法:

class ConcreteProductA : public AbstractProduct {
public:
    void operation() override {
        std::cout << "ConcreteProductA operation" << std::endl;
    }
};
class ConcreteProductB : public AbstractProduct {
public:
    void operation() override {
        std::cout << "ConcreteProductB operation" << std::endl;
    }
};

接下来,定义抽象工厂接口 AbstractFactory,它包含了创建一系列产品的方法:

class AbstractFactory {
public:
    virtual AbstractProduct* createProductA() = 0;
    virtual AbstractProduct* createProductB() = 0;
    virtual ~AbstractFactory() {}
};

然后,定义具体工厂类 ConcreteFactory,它实现了抽象工厂接口,负责创建一组特定的产品:

class ConcreteFactory : public AbstractFactory {
public:
    AbstractProduct* createProductA() override {
        return new ConcreteProductA();
    }
    AbstractProduct* createProductB() override {
        return new ConcreteProductB();
    }
};

最后,客户端使用抽象工厂来创建一组产品:

int main() {
    AbstractFactory* factory = new ConcreteFactory();
    AbstractProduct* productA = factory->createProductA();
    AbstractProduct* productB = factory->createProductB();
    productA->operation();
    productB->operation();
    delete productA;
    delete productB;
    delete factory;
    return 0;
}

输出结果为:

ConcreteProductA operation
ConcreteProductB operation

🎉三、注意事项

使用抽象工厂模式需要注意以下几点:

  1. 接口设计要合理:抽象工厂模式依赖接口而不是实现,因此在设计时需要考虑到具体产品的可能性和变化,保证接口足够灵活。
  2. 工厂类实现适度复杂:抽象工厂模式需要一个或多个工厂类来生产不同类型的产品,这些工厂类的实现会比较复杂且耦合度较高,需要根据具体情况进行权衡,尽量避免过于复杂的实现。
  3. 产品族扩展困难:抽象工厂模式的主要目的是支持多种产品族的扩展,但如果需要增加新的产品族,则需要修改工厂接口和所有的工厂实现,这一过程比较麻烦。
  4. 客户端代码可读性较差:由于抽象工厂模式提供了多个接口和多个产品等级结构,因此客户端代码相对会比较复杂,可读性不如简单工厂模式和工厂方法模式那么好。

🐱‍🚀四、抽象工厂模式什么时候用

  1. 当需要创建一组相关或相互依赖的对象时,可以使用抽象工厂模式。例如,创建一个具有不同操作系统的应用程序,每个操作系统都有自己的一组 UI 控件,可以使用抽象工厂模式来创建这些控件。
  2. 当希望客户端与具体产品的实现相分离时,可以使用抽象工厂模式。客户端只需要知道抽象工厂接口和抽象产品接口,而不需要知道具体工厂类和具体产品类的实现细节。
  3. 当希望系统更加灵活、易于扩展和维护时,可以使用抽象工厂模式。通过使用抽象工厂模式,可以轻松添加新的产品系列,而不会影响现有的代码。

需要注意的是,抽象工厂模式适用于创建一系列相关或相互依赖的产品,如果只需要创建单个产品,或者产品之间没有关系,则不适合使用抽象工厂模式。


🍳参考文献

🧊文章总结

提示:这里对文章进行总结:

  本文讲了关于抽象工厂模式的概念


目录
相关文章
|
3月前
|
设计模式
工厂模式与抽象工厂模式
​ 如有错误或有补充,以及任何的改进意见,请在评论区留下您的高见 工厂模式 工厂模式是一种创建型设计模式。在工厂模式中,类的实例化过程通常是通过一个专门的工厂类来完成的,而不是直接在客户端代码中进行的。这样可以提供更好的封装,使得客户端代码与具体产品的实现解耦,增加代码的灵活性和可维护性。 优点 封装性:客户端代码不再需要知道所创建对象的详细信息,只需要与工厂接口进行交互即可。 灵活性:工厂模式使得系统更加灵活,可以在不修改客户端代码的情况下更换或添加新产品。 可扩展性:通过使用工厂模式,当需要添加新产品时,只需要扩展工厂类,而不需要修改客户端代码。 基本结构 抽象产品(Abstra
35 0
|
3月前
|
Java API 数据库
工厂方法模式
工厂方法模式
28 0
|
设计模式 C++
2023-6-10-第一式工厂方法模式
2023-6-10-第一式工厂方法模式
71 0
|
11月前
浅谈抽象工厂模式
浅谈抽象工厂模式
|
11月前
浅谈工厂方法模式
浅谈工厂方法模式
|
设计模式 监控 uml
剖析工厂方法模式、从开电脑店开始
工厂类负责把实例化类时,复杂的过程透明化,同时避免大量实例化类的重复代码的出现。
剖析工厂方法模式、从开电脑店开始
|
设计模式 算法 搜索推荐
工厂方法模式的两个极端
概念:是一种常用的对象创建型设计模式,此模式的核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。
|
设计模式
工厂方法模式详细介绍
工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它提供了一种将对象的创建逻辑封装在工厂类中的方式,使得客户端代码无需直接依赖具体的类来创建对象。
87 0
|
设计模式 关系型数据库 程序员
简单工厂模式、工厂模式、抽象工厂模式
简单工厂模式、工厂模式、抽象工厂模式
123 2
简单工厂模式、工厂模式、抽象工厂模式
|
XML 存储 JSON
抽象工厂模式
抽象工厂模式