设计模式七:抽象工厂模式(Abstract Factory Pattern)

抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种方式来封装一组具有共同主题的独立工厂,而不需要指定它们的具体类。

基本概念

抽象工厂模式主要解决的是创建一系列相关或依赖对象的问题,而不需要指定它们的具体类。它通常包含:

  1. 抽象工厂(Abstract Factory):声明创建抽象产品对象的接口

  2. 具体工厂(Concrete Factory):实现创建具体产品对象的操作

  3. 抽象产品(Abstract Product):为一类产品对象声明接口

  4. 具体产品(Concrete Product):定义具体工厂创建的产品对象

实现示例

复制代码
#include <iostream>
#include <memory>

// 抽象产品A
class AbstractProductA {
public:
    virtual ~AbstractProductA() = default;
    virtual void use() = 0;
};

// 具体产品A1
class ProductA1 : public AbstractProductA {
public:
    void use() override {
        std::cout << "Using Product A1" << std::endl;
    }
};

// 具体产品A2
class ProductA2 : public AbstractProductA {
public:
    void use() override {
        std::cout << "Using Product A2" << std::endl;
    }
};

// 抽象产品B
class AbstractProductB {
public:
    virtual ~AbstractProductB() = default;
    virtual void operate() = 0;
};

// 具体产品B1
class ProductB1 : public AbstractProductB {
public:
    void operate() override {
        std::cout << "Operating Product B1" << std::endl;
    }
};

// 具体产品B2
class ProductB2 : public AbstractProductB {
public:
    void operate() override {
        std::cout << "Operating Product B2" << std::endl;
    }
};

// 抽象工厂
class AbstractFactory {
public:
    virtual ~AbstractFactory() = default;
    virtual std::unique_ptr<AbstractProductA> createProductA() = 0;
    virtual std::unique_ptr<AbstractProductB> createProductB() = 0;
};

// 具体工厂1
class ConcreteFactory1 : public AbstractFactory {
public:
    std::unique_ptr<AbstractProductA> createProductA() override {
        return std::make_unique<ProductA1>();
    }
    
    std::unique_ptr<AbstractProductB> createProductB() override {
        return std::make_unique<ProductB1>();
    }
};

// 具体工厂2
class ConcreteFactory2 : public AbstractFactory {
public:
    std::unique_ptr<AbstractProductA> createProductA() override {
        return std::make_unique<ProductA2>();
    }
    
    std::unique_ptr<AbstractProductB> createProductB() override {
        return std::make_unique<ProductB2>();
    }
};

// 客户端代码
void clientCode(const AbstractFactory& factory) {
    auto productA = factory.createProductA();
    auto productB = factory.createProductB();
    
    productA->use();
    productB->operate();
}

int main() {
    std::cout << "Client: Testing client code with the first factory type:\n";
    ConcreteFactory1 factory1;
    clientCode(factory1);
    
    std::cout << "\nClient: Testing client code with the second factory type:\n";
    ConcreteFactory2 factory2;
    clientCode(factory2);
    
    return 0;
}

UML结构

优点

  1. 隔离具体类:客户端代码只与抽象接口交互,不依赖于具体实现

  2. 产品一致性:确保从同一工厂创建的产品是兼容的

  3. 易于交换产品系列:只需改变具体工厂即可切换整个产品系列

  4. 符合开闭原则:添加新产品系列时不需要修改现有代码

缺点

  1. 扩展困难:添加新产品需要修改抽象工厂接口及其所有子类

  2. 复杂性增加:代码结构变得更加复杂,增加了理解和维护的难度

适用场景

  1. 系统需要独立于其产品的创建、组合和表示时

  2. 系统需要配置多个产品系列中的一个时

  3. 需要强调一系列相关产品对象的设计以便进行联合使用时

  4. 提供一个产品类库,只想显示它们的接口而非实现时

抽象工厂模式是工厂方法模式的进一步抽象,适用于产品结构较复杂、产品系列较多的情况。

相关推荐
你这个代码我看不懂1 分钟前
Java软引用对象的创建以及对象回收
java·开发语言
qq_417695052 分钟前
C++中的中介者模式
开发语言·c++·算法
xiangpanf3 分钟前
PHP爬虫框架:Goutte vs Panther
开发语言·c++·vue.js·php
~无忧花开~5 分钟前
React元素渲染:核心概念全解析
开发语言·前端·javascript·react.js
像素猎人12 分钟前
pair<类型1, 类型2> 变量名的介绍,自用笔记
开发语言·c++·算法
向往着的青绿色14 分钟前
完全平方数【Letcode279题解】
开发语言·c++·数学·算法·面试·性能优化·动态规划
佩奇大王23 分钟前
P103 日期问题
java·开发语言·算法
酉鬼女又兒26 分钟前
零基础入门前端JavaScript 基础语法详解(可用于备赛蓝桥杯Web应用开发)
开发语言·前端·javascript·chrome·蓝桥杯
计算机安禾31 分钟前
【C语言程序设计】第38篇:链表数据结构(二):链表的插入与删除操作
c语言·开发语言·数据结构·c++·算法·链表
oem11034 分钟前
C++中的适配器模式
开发语言·c++·算法