基础理解
Q:抽象工厂与简单工厂有什么不同
A:抽象工厂适用于一个产品下面有许多具体的子产品,而简单工厂则是只有一个单一的产品。所以抽象工厂在使用中会多一些。
Q:抽象工厂的应用场景
A:首先你要懂得简单工厂的思路用法,如果你需要与多个不同系列(椅子,沙发)的相关产品(维多利亚,现代)交互, 但是由于无法提前获取具体产品类 (现代椅子 ), 或者出于对未来扩展性的考虑, 你不希望代码基于产品的具体类进行构建,在这种情况下, 你可以使用抽象工厂。
跳转观看简单工厂
注意点
- 兼容性:确保由同一抽象工厂创建的所有产品都是兼容的,并且可以系统中无缝地进行交互和替换。
- 管理变体:确保每个变体都有对应的工厂,并且工厂创建的产品能够符合该变体的特性和要求。
- 足够抽象:遵循循依赖倒置原则,即高层模块不应该依赖于具体的实现细节,而应该依赖于抽象
在我下面写的代码中,ClientCode(客户端) 依赖于抽象类(抽象工厂AbstractFactory) 不具体依赖于是维多利亚工厂 或 现代工厂
创建抽象工厂
例如我们有:
- 椅子种类:维多利亚椅子 现代椅子…
- 沙发种类:维多利亚沙发 现代沙发…
拆分一下椅子种类
我们需要声明抽象工厂(AbstractFactory)——包含系列中所有产品构造方法的接口:Creat_Chair
和 Creat_Sofa
基于抽象工厂类创建 具体分支的工厂:维多利亚工厂 和 现代工厂 (维多利亚工厂只能创建维多利亚椅子,和维多利亚沙发)
UML图
看个大体,明白之间的关系即可
空心箭头:继承关系
虚线箭头:依赖
实线箭头:关联
#include <bits/stdc++.h>
using namespace std;
/**
产品家族的每个不同产品都应该有一个基础接口。产品的所有变体都必须实现这个接口。
*/
class Chair
{
public:
virtual ~Chair(){
};
virtual std::string name() const = 0;
};
class VictorianChair : public Chair
{
public:
std::string name() const override
{
return "维多利亚椅子\n";
}
};
class ModernChair : public Chair
{
std::string name