02_23 种设计模式之《抽象工厂模式》

文章目录

一、抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)隶属于设计模式中的创建型模式,用于产品族的构建。抽象工厂是指当有多个抽象角色时使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象。工厂模式中的每一个形态都是针对一定问题的解决方案,工厂方法针对的是多个产品系列结构;而抽象工厂模式针对的是多个产品族结构,一个产品族内有多个产品系列。提供一个创建一系列相互依赖对象的接口,而无需指定它们具体的类。

主要目的解决:主要解决接口问题的选择。

在抽象工厂模式当中,客户端不再负责对象的创建,而是把这个责任丢给具体的工厂类,客户端只负责对对象的调用,从而明确各个类的职责。

抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种创建一系列相关或相互依赖对象的接口,而不需要指定它们的具体类。这种模式非常适合在需要生成多个对象族,而这些对象族之间存在某种关系时使用。

抽象工厂模式的结构

抽象工厂模式通常包含以下角色:

  1. 抽象工厂(Abstract Factory):定义创建一系列抽象产品的方法的接口。
  2. 具体工厂(Concrete Factory):实现抽象工厂接口,生成一系列的具体产品。
  3. 抽象产品(Abstract Product):定义产品对象的接口。
  4. 具体产品(Concrete Product):实现抽象产品的接口,由具体工厂创建。

应用场景

抽象工厂模式适用于以下情况:

  1. 需要生成一系列相关或相互依赖的对象:这些对象通常属于相同的产品族,例如不同的操作系统界面控件。
  2. 需要强调一系列对象的创建,而不是单个对象的创建
  3. 提供一个产品类库,所有的产品以同样的接口出现,使客户端不依赖于具体实现
  4. 当系统需要提供可交换主题或皮肤时,如不同的操作系统主题。

示例代码(C++)

cpp 复制代码
// 抽象产品A
class AbstractProductA {
public:
    virtual void Use() = 0;
};

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

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

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

// 具体产品B1
class ConcreteProductB1 : public AbstractProductB {
public:
    void Use() override {
        std::cout << "Using B1" << std::endl;
    }
};

// 具体产品B2
class ConcreteProductB2 : public AbstractProductB {
public:
    void Use() override {
        std::cout << "Using B2" << 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->Use();
    productB->Use();
    delete productA;
    delete productB;
    delete factory;
    return 0;
}

注意事项

  • 扩展性 :如果需要添加新的产品族,需要修改抽象工厂和所有具体工厂类,这可能会影响现有代码。
  • 复杂性:模式可能会增加系统的复杂性,因为需要定义和管理多个抽象和具体类。
相关推荐
帅次34 分钟前
基于云平台的智能家居管理系统设计与通信协议分析
设计模式·重构·软件工程·软件构建·需求分析·代码规范·设计规范
大白的编程日记.1 小时前
【C++笔记】list结构剖析及其模拟实现
c++·笔记·list
AlexMercer10122 小时前
[C++ 核心编程]笔记 4.2.6 初始化列表
开发语言·数据结构·c++·笔记·算法
程序员阿鹏2 小时前
详解:模板设计模式
java·开发语言·jvm·后端·设计模式·eclipse·1024程序员节
zzzhpzhpzzz2 小时前
设计模式——享元模式
算法·设计模式·享元模式
何苏三月2 小时前
设计模式 - 简单工厂模式
java·设计模式·简单工厂模式
鳄鱼麻薯球3 小时前
【Qt】系统相关——多线程、Qt多线程介绍、常用函数、线程安全、网络、UDP Socket、TCP Socket
网络·c++·qt
玉树临风ives3 小时前
2024 CSP-J 题解
c++·算法·深度优先·动态规划
大山同学3 小时前
Swarm-LIO: Decentralized Swarm LiDAR-inertial Odometry论文翻译
c++·人工智能·算法·去中心化·区块链
Slow菜鸟4 小时前
Spring 设计模式之策略模式
spring·设计模式·策略模式