【c++设计模式05】创建型3:抽象工厂模式(Abstact Factory Pattern)
- 一、工厂模式
- 二、抽象工厂模式
- 三、UML类图
- 四、demo
- 五、总结
原创作者:郑同学的笔记
原创地址:https://zhengjunxue.blog.csdn.net/article/details/132306496
qq技术交流群:921273910
类型 | 序号 | 设计模式 | 描述 |
创建型 | 1 | 简单工厂模式 (Simple Factory Pattern) | 通过一个工厂类负责创建所有产品的实例 |
2 | 工厂方法模式 (Factory Pattern) | 将对象的实例化延迟到子类中实现 | |
3 | 抽象工厂模式 (Abstact Factory Pattern) | 通过提供一组相关产品的接口,实现了一系列具体工厂类来创建不同产品族的实例 | |
4 | 单例模式 (Singleton Pattern) | 保证一个类只有一个实例 | |
5 | 创建者模式 (Builder Pattern) | 如何创建一个组合对象 | |
6 | 原型模式 (Prototype Pattern) | 它通过复制已有对象来创建新的实例 |
一、工厂模式
-
工厂模式是一种软件设计模式,它提供了一种创建对象的方式,将对象的实例化和使用分离开来。工厂模式通过定义一个公共的接口或抽象类来创建对象,并由实现该接口或继承该抽象类的具体工厂类负责实例化对象。
-
在工厂模式中,客户端通过调用工厂类的方法来获取所需的对象,而无需直接实例化对象。工厂类根据不同的需求条件,使用不同的逻辑或算法创建相应的对象,隐藏了对象创建的具体细节。
-
工厂模式可以有效地降低系统的耦合度,提高代码的可维护性和可扩展性。它符合面向对象设计原则中的开放封闭原则,即对扩展开放,对修改封闭。当需要新增一种产品时,只需添加相应的具体产品类和对应的工厂类,而无需修改已有的代码。
-
常见的工厂模式包括简单工厂模式、工厂方法模式和抽象工厂模式。
简单工厂模式通过一个工厂类负责创建所有产品的实例;
工厂方法模式将对象的实例化延迟到子类中实现;
抽象工厂模式通过提供一组相关产品的接口,实现了一系列具体工厂类来创建不同产品族的实例。
二、抽象工厂模式
工厂模式里面,只有苹果、香蕉,实际情况可能更加的复杂,比如苹果也有不同的国家生成的,比如
水果\国家 | 中国 | 美国 |
---|---|---|
苹果 | 中国苹果 | 美国苹果 |
香蕉 | 中国香蕉 | 美国香蕉 |
在抽象工厂模式中,除了有产品的抽象类(Apple和Banana),还有一个抽象的工厂类(Factory)。工厂类定义了一个或多个用于创建不同类别产品的纯虚函数,其中每个纯虚函数对应一个具体的产品。在这段代码中,Factory类中的createApple()和createBanana()函数就是抽象工厂方法。
然后通过具体的工厂类(ChinaFactory和USAFactory)继承抽象工厂类,并实现了抽象工厂类中的纯虚函数,这些具体的工厂类分别负责创建中国水果和美国水果的对象。
抽象工厂模式的优点是可以确保客户端只能访问抽象接口,而不用担心具体的产品类。它提供了一种灵活的方式来创建相关的产品族,且易于替换不同的具体工厂类。缺点是当需要添加新的产品类时,需要修改抽象工厂和所有的具体工厂类,违反了开闭原则。
总结来说,抽象工厂模式是一种创建一族相关对象的设计模式,通过定义抽象的工厂类和产品类,以及具体的工厂类的组合,实现了对象的创建与客户端的解耦。这种模式在需要创建一系列相关对象时非常有用,可以根据不同的具体工厂类来创建不同产品族的对象。
三、UML类图
- 当然,苹果和香蕉也可以同时继承一个水果类,但是我们这里用不到,就不画了。
- 抽象工厂模式AbstractFactory 模式就是用来解决这类问题的:要创建一组相关或者相互依赖的对象。
四、demo
#include<iostream>
using namespace std;class Apple {
public:virtual void say() {};virtual ~Apple() {};
};
class Banana {
public:virtual void say() {};virtual ~Banana() {};
};
class ChinaApple : public Apple {
public:void say() override{cout << "i am a China Apple\n";}
};
class ChinaBanana : public Banana {
public:void say(){cout << "i am a china Banana\n";}
};class USAApple : public Apple {
public:void say() override{cout << "i am a USA Apple\n";}
};
class USABanana : public Banana {
public:void say(){cout << "i am a USA Banana\n";}
};class Factory {
public:virtual Apple* createApple() = 0;virtual Banana* createBanana() = 0;virtual ~Factory() {};
};class USAFactory:public Factory {
public:Apple* createApple() override{return new USAApple;}Banana* createBanana() override {return new USABanana;}
};class ChinaFactory :public Factory {
public:Apple* createApple() override {return new ChinaApple;}Banana* createBanana() override {return new ChinaBanana;}
};int main()
{Factory* factory = new ChinaFactory();Apple* obj = factory->createApple();obj->say();factory = new USAFactory();Banana* obj2 = factory->createBanana();obj2->say();return 0;
}
输出
五、总结
AbstractFactory 模式和 Factory模式的区别是初学(使用)设计模式时候的一个容易引起困惑的地方。实际上,AbstractFactory模式是为创建一组(有多类)相关或依赖的对象提供创建接口,而 Factory模式是为一类对象提供创建接口或延迟对象的创建到子类中实现。并且可以看到,AbstractFactory模式通常都是使用 Factory 模式实现。