抽象工厂模式 (Abstract Factory Pattern)

devtools/2025/3/17 6:48:17/

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

一、基础

1. 意图

  • 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

2. 适用场景

  • 当一个系统要独立于它的产品的创建、组合和表示时。
  • 当一个系统要由多个产品系列中的一个来配置时。
  • 当你要强调一系列相关的产品对象的设计以便进行联合使用时。
  • 当你提供一个产品类库,而只想显示它们的接口而不是实现时。

3. 结构

  • 抽象产品族(AbstractProductFamily):定义了一系列相关产品的抽象接口,这些产品之间存在某种关联或依赖关系。​
  • 具体产品(ConcreteProduct):实现了抽象产品族接口的具体产品类。每个具体产品类对应抽象产品族中的一个产品。​
  • 抽象工厂(AbstractFactory):声明了创建抽象产品族中各个产品的抽象方法。抽象工厂类负责定义创建一系列相关产品的接口,这些产品构成一个产品族。​
  • 具体工厂(ConcreteFactory):实现了抽象工厂中声明的创建各个产品的方法,用于创建具体的产品对象。每个具体工厂类负责创建特定产品族中的所有产品。​

二、进阶

1. 抽象工厂模式的优点

  • 抽象工厂模式隔离了具体类的生成,使得客户并不需要知道什么被创建。
  • 当一个产品族中的多个对象被设计成一起工作时,抽象工厂模式能够保证客户端始终只使用同一个产品族中的对象。
  • 增加新的具体工厂和产品族很方便,无需修改已有系统,符合“开闭原则”。

2. 抽象工厂模式的缺点

  • 增加新的产品等级结构麻烦,需要对原有系统进行较大的修改,甚至需要修改抽象层代码,违背了“开闭原则”。

3. 抽象工厂模式的应用

  • 抽象工厂模式广泛应用于各种框架和库中,例如 Spring 框架、Hibernate 框架等。
  • 抽象工厂模式也可以用于开发各种应用程序,例如游戏、图形用户界面等。

三、关键技术

1. 抽象工厂模式的实现

2. 抽象工厂模式的扩展

四、易错点

1. 抽象工厂模式的滥用

2. 抽象工厂模式的性能问题

  • 抽象工厂模式可能会降低代码的性能,因为每次创建对象时都需要调用工厂方法。

五、核心代码

5.1 抽象工厂模式的简单实现

// AbstractProductA
class AbstractProductA {
public:virtual void use() = 0;
};// ConcreteProductA1
class ConcreteProductA1 : public AbstractProductA {
public:void use() override {std::cout << "Using ConcreteProductA1" << std::endl;}
};// ConcreteProductA2
class ConcreteProductA2 : public AbstractProductA {
public:void use() override {std::cout << "Using ConcreteProductA2" << std::endl;}
};// AbstractProductB
class AbstractProductB {
public:virtual void eat() = 0;
};// ConcreteProductB1
class ConcreteProductB1 : public AbstractProductB {
public:void eat() override {std::cout << "Eating ConcreteProductB1" << std::endl;}
};// ConcreteProductB2
class ConcreteProductB2 : public AbstractProductB {
public:void eat() override {std::cout << "Eating ConcreteProductB2" << std::endl;}
};// AbstractFactory
class AbstractFactory {
public:virtual AbstractProductA* createProductA() = 0;virtual AbstractProductB* createProductB() = 0;
};// ConcreteFactory1
class ConcreteFactory1 : public AbstractFactory {
public:AbstractProductA* createProductA() override {return new ConcreteProductA1();}AbstractProductB* createProductB() override {return new ConcreteProductB1();}
};// ConcreteFactory2
class ConcreteFactory2 : public AbstractFactory {
public:AbstractProductA* createProductA() override {return new ConcreteProductA2();}AbstractProductB* createProductB() override {return new ConcreteProductB2();}
};// Client
int main() {AbstractFactory* factory = new ConcreteFactory1();AbstractProductA* productA = factory->createProductA();AbstractProductB* productB = factory->createProductB();productA->use();productB->eat();delete factory;delete productA;delete productB;factory = new ConcreteFactory2();productA = factory->createProductA();productB = factory->createProductB();productA->use();productB->eat();delete factory;delete productA;delete productB;return 0;
}

5.2 抽象工厂模式的扩展实现

// AbstractProductA
class AbstractProductA {
public:virtual void use() = 0;
};// ConcreteProductA1
class ConcreteProductA1 : public AbstractProductA {
public:void use() override {std::cout << "Using ConcreteProductA1" << std::endl;}
};// ConcreteProductA2
class ConcreteProductA2 : public AbstractProductA {
public:void use() override {std::cout << "Using ConcreteProductA2" << std::endl;}
};// AbstractProductB
class AbstractProductB {
public:virtual void eat() = 0;
};// ConcreteProductB1
class ConcreteProductB1 : public AbstractProductB {
public:void eat() override {std::cout << "Eating ConcreteProductB1" << std::endl;}
};// ConcreteProductB2
class ConcreteProductB2 : public AbstractProductB {
public:void eat() override {std::cout << "Eating ConcreteProductB2" << std::endl;}
};// AbstractFactory
class AbstractFactory {
public:virtual AbstractProductA* createProductA() = 0;virtual AbstractProductB* createProductB() = 0;
};// ConcreteFactory1
class ConcreteFactory1 : public AbstractFactory {
public:AbstractProductA* createProductA() override {return new ConcreteProductA1();}AbstractProductB* createProductB() override {return new ConcreteProductB1();}
};// ConcreteFactory2
class ConcreteFactory2 : public AbstractFactory {
public:AbstractProductA* createProductA() override {return new ConcreteProductA2();}AbstractProductB* createProductB() override {return new ConcreteProductB2();}
};// Client
int main() {AbstractFactory* factory = new ConcreteFactory1();AbstractProductA* productA = factory->createProductA();AbstractProductB* productB = factory->createProductB();productA->use();productB->eat();delete factory;delete productA;delete productB;factory = new ConcreteFactory2();productA = factory->createProductA();productB = factory->createProductB();productA->use();productB->eat();delete factory;delete productA;delete productB;return 0;
}

六、总结

抽象工厂模式通过将对象的创建和使用进一步分离,为创建一系列相关或相互依赖的对象提供了一种优雅的解决方案。它在提高系统的可扩展性和可维护性方面具有显著优势,但同时也增加了系统的复杂性。在实际开发中,需要根据具体的业务需求和系统架构来权衡是否使用抽象工厂模式。如果系统中存在多个产品族,并且产品之间存在复杂的依赖关系,那么抽象工厂模式是一个很好的选择。


http://www.ppmy.cn/devtools/167753.html

相关文章

2、操作系统之软件基础

一、硬件支持系统 &#xff0c;系统管理硬件 操作系统核心功能可以分为&#xff1a; 守护者&#xff1a;对硬件和软件资源的管理协调者&#xff1a;通过机制&#xff0c;将各种各样的硬件资源适配给软件使用。 所以为了更好的管理硬件&#xff0c;操作系统引进了软件。其中3大…

基于django+vue的购物商城系统

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.8数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 系统首页 热卖商品 优惠资讯 个人中心 后台登录 管理员功能界面 用户管理 商品分类管理…

56.HarmonyOS NEXT 登录模块开发教程(十):总结与展望

温馨提示&#xff1a;本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦&#xff01; HarmonyOS NEXT 登录模块开发教程&#xff08;十&#xff09;&#xff1a;总结与展望 文章目录 HarmonyOS NEXT 登录模块开发教程&#xff08;十&a…

解决PC串流至IPad Pro时由于分辨率不一致导致的黑边问题和鼠标滚轮反转问题

问题背景 今天在做 电脑串流ipad pro 的时候发现了2个问题&#xff1a; 1.ipadpro 接上鼠标后&#xff0c;滚轮上下反转&#xff0c;这个是苹果自己的模拟造成的问题&#xff0c;在设置里选择“触控板与鼠标”。 关闭“自然滚动”,就可以让鼠标滚轮正向滚动。 2. ipadpro 分…

css实现报警特效

报警特效通常包括闪烁、颜色变化或者动态的警示框。 这里我优先使用纯CSS和原生JavaScript&#xff0c;避免使用框架。同时&#xff0c;注意浏览器的兼容性&#xff0c;比如使用浏览器前缀或者替代属性。 CSS报警特效实现方法 报警特效通常需要结合颜色渐变、闪烁动画、动态…

python实现接口自动化

代码实现自动化相关理论 代码编写脚本和工具实现脚本区别是啥? 代码&#xff1a; 优点&#xff1a;代码灵活方便缺点&#xff1a;学习成本高 工具&#xff1a; 优点&#xff1a;易上手缺点&#xff1a;灵活度低&#xff0c;有局限性。 总结&#xff1a; 功能脚本&#xff1a;工…

【后端】【django】Django 自带的用户系统与 RBAC 机制

Django 自带的用户系统与 RBAC 机制 Django 自带的用户系统&#xff08;django.contrib.auth&#xff09;提供了 身份验证&#xff08;Authentication&#xff09; 和 权限管理&#xff08;Authorization&#xff09;&#xff0c;能够快速实现 用户管理、权限控制、管理员后台…

机器学习周报--文献阅读

文章目录 摘要Abstract 1 文章内容1.1 模型结构1.1.1 LSTMAT的结构设置1.1.2 AWPSO算法优化模型 1.2 实验与结果讨论1.2.1 处理缺失数据1.2.2 模型评估指标1.2.3 比较实验1.2.4 消融实验&#xff08;ABLATION EXPERIMENTS&#xff09; 2相关知识2.1 自适应权重粒子群优化&#…