设计模式--工厂模式(Factory Pattern)

一、 什么是工厂模式

工厂模式(Factory Pattern)是一种创建型设计模式,它提供了一种创建对象的接口,但是将对象的实例化过程推迟到子类中。工厂模式允许通过调用一个共同的接口方法来创建不同类型的对象,而无需暴露对象的实例化逻辑。

工厂模式的主要目标是解耦对象的创建和使用,以及提供一种更灵活的方式来管理对象的实例化。通过使用工厂模式,可以轻松添加新类型的对象,而不会影响到已有的代码。

工厂模式通常涉及以下几个核心角色:

  1. 产品(Product):这是一个抽象类或接口,定义了所创建对象的通用接口。
  2. 具体产品(Concrete Product):这些是实现了产品接口的具体类,它们是工厂方法模式的创建目标。
  3. 工厂(Factory):这是一个抽象类或接口,定义了创建对象的接口方法。工厂类通常是一个创建具体产品对象的工厂方法。
  4. 具体工厂(Concrete Factory):这些是实现了工厂接口的具体类,它们负责实例化具体的产品对象。

工厂模式可以分为三种常见的变体:

  1. 简单工厂模式(Simple Factory Pattern):通过一个共同的工厂类来创建对象,客户端只需传递一个参数来指定所需的对象类型。虽然不是严格意义上的设计模式,但它是工厂模式的基础。
  2. 工厂方法模式(Factory Method Pattern):定义一个工厂接口,具体的工厂子类负责实现工厂接口并创建对象。每个具体工厂对应一个特定的产品。
  3. 抽象工厂模式(Abstract Factory Pattern):提供了一种创建一系列相关或相互依赖对象的接口,而无需指定具体类。适用于创建一组相互关联的产品。

二、简单工厂模式的代码样例

简单工厂模式(Simple Factory Pattern)虽然不是严格的设计模式,但它是工厂模式的一种基本形式,适用于创建单一类别的对象。在简单工厂模式中,有一个工厂类负责根据客户端的请求创建不同类型的对象。

以下是一个用C++实现简单工厂模式的示例:

#include <iostream>// 抽象产品类
class Product {
public:virtual void operation() = 0;
};// 具体产品类A
class ConcreteProductA : public Product {
public:void operation() override {std::cout << "ConcreteProductA operation." << std::endl;}
};// 具体产品类B
class ConcreteProductB : public Product {
public:void operation() override {std::cout << "ConcreteProductB operation." << std::endl;}
};// 简单工厂类
class SimpleFactory {
public:// 根据传入的参数创建不同类型的产品对象static Product* createProduct(char type) {if (type == 'A') {return new ConcreteProductA();} else if (type == 'B') {return new ConcreteProductB();} else {return nullptr; // 可以抛出异常或其他处理}}
};int main() {// 客户端通过工厂创建产品Product* productA = SimpleFactory::createProduct('A');Product* productB = SimpleFactory::createProduct('B');if (productA) {productA->operation();delete productA;}if (productB) {productB->operation();delete productB;}return 0;
}

在这个例子中,我们定义了一个抽象产品类 Product,然后有两个具体的产品类 ConcreteProductA 和 ConcreteProductB。简单工厂类 SimpleFactory 有一个静态方法 createProduct,根据传入的参数来创建不同类型的产品对象。

虽然简单工厂模式简化了对象的实例化,但它的弊端在于如果需要添加新类型的产品,就需要修改工厂类的代码。因此,当需要支持更多产品类型时,更推荐使用工厂方法模式或抽象工厂模式。

三、工厂方法模式的代码样例

工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,但是将具体的对象实例化推迟到子类中。每个具体的工厂子类负责创建特定类型的对象。这种模式使得客户端代码与具体创建对象的代码分离,实现了松耦合。

以下是一个用C++实现工厂方法模式的示例:

#include <iostream>// 抽象产品类
class Product {
public:virtual void operation() = 0;
};// 具体产品类A
class ConcreteProductA : public Product {
public:void operation() override {std::cout << "ConcreteProductA operation." << std::endl;}
};// 具体产品类B
class ConcreteProductB : public Product {
public:void operation() override {std::cout << "ConcreteProductB operation." << std::endl;}
};// 抽象工厂类
class Factory {
public:virtual Product* createProduct() = 0;
};// 具体工厂类A
class ConcreteFactoryA : public Factory {
public:Product* createProduct() override {return new ConcreteProductA();}
};// 具体工厂类B
class ConcreteFactoryB : public Factory {
public:Product* createProduct() override {return new ConcreteProductB();}
};int main() {// 客户端通过具体工厂来创建产品Factory* factoryA = new ConcreteFactoryA();Product* productA = factoryA->createProduct();productA->operation();delete factoryA;delete productA;Factory* factoryB = new ConcreteFactoryB();Product* productB = factoryB->createProduct();productB->operation();delete factoryB;delete productB;return 0;
}

在这个例子中,我们定义了一个抽象产品类 Product,然后有两个具体的产品类 ConcreteProductA 和 ConcreteProductB。抽象工厂类 Factory 定义了一个纯虚函数 createProduct,由具体的工厂子类来实现该方法并创建特定类型的产品对象。

客户端使用具体的工厂类来创建产品,这样客户端代码与具体的产品创建代码分离,实现了解耦。工厂方法模式允许通过添加新的工厂子类来支持新的产品类型,而无需修改现有的代码。

四、抽象工厂模式的代码样例

抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供一个接口用于创建一系列相关或相互依赖的对象,而无需指定具体类。抽象工厂模式适用于需要创建一组相互关联的产品的情况,它将一组相关的工厂类封装起来。

以下是一个用C++实现抽象工厂模式的示例:

#include <iostream>// 抽象产品类A
class AbstractProductA {
public:virtual void operationA() = 0;
};// 具体产品类A1
class ConcreteProductA1 : public AbstractProductA {
public:void operationA() override {std::cout << "ConcreteProductA1 operation." << std::endl;}
};// 具体产品类A2
class ConcreteProductA2 : public AbstractProductA {
public:void operationA() override {std::cout << "ConcreteProductA2 operation." << std::endl;}
};// 抽象产品类B
class AbstractProductB {
public:virtual void operationB() = 0;
};// 具体产品类B1
class ConcreteProductB1 : public AbstractProductB {
public:void operationB() override {std::cout << "ConcreteProductB1 operation." << std::endl;}
};// 具体产品类B2
class ConcreteProductB2 : public AbstractProductB {
public:void operationB() override {std::cout << "ConcreteProductB2 operation." << 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* factory1 = new ConcreteFactory1();AbstractProductA* productA1 = factory1->createProductA();AbstractProductB* productB1 = factory1->createProductB();productA1->operationA();productB1->operationB();delete factory1;delete productA1;delete productB1;AbstractFactory* factory2 = new ConcreteFactory2();AbstractProductA* productA2 = factory2->createProductA();AbstractProductB* productB2 = factory2->createProductB();productA2->operationA();productB2->operationB();delete factory2;delete productA2;delete productB2;return 0;
}

在这个例子中,我们定义了两组相关的产品类:AbstractProductA 和 AbstractProductB,然后分别有两个具体的产品类。抽象工厂类 AbstractFactory 定义了两个纯虚函数,分别用于创建 AbstractProductA 和 AbstractProductB 对象。具体的工厂类 ConcreteFactory1 和 ConcreteFactory2 实现了这些方法,并创建特定类型的产品对象。

通过使用抽象工厂模式,客户端可以通过具体的工厂来创建一组相关的产品,实现了一种创建一系列相互关联产品的方式。这有助于实现高内聚、低耦合的设计。

五、三种工厂模式之间的关系

这三种工厂模式(简单工厂模式、工厂方法模式和抽象工厂模式)都是创建型设计模式,旨在解决对象的创建问题。它们之间有一些共同点,但也存在一些差异。下面是它们之间的关系和区别:

共同点:

  • 都关注对象的创建,封装了对象的实例化过程,使客户端代码与具体创建逻辑分离。
  • 都遵循了开闭原则,即可以通过添加新的产品类或工厂类来扩展功能,而无需修改现有代码。

差异:

  • 简单工厂模式:虽然不是严格意义上的设计模式,但它是工厂模式的基础。它通过一个共同的工厂类来创建不同类型的对象,客户端根据参数来指定对象类型。适用于创建单一类别的对象。
  • 工厂方法模式:定义了一个工厂接口,由具体的工厂子类来实现工厂接口并创建特定类型的产品对象。每个工厂只负责创建一种产品。适用于创建一组相关的产品,每个产品有一个对应的工厂。
  • 抽象工厂模式:提供了一种创建一组相关或相互依赖对象的接口,每个具体的工厂子类负责创建一组相关产品。适用于创建一组相互关联的产品,每组产品都有一个对应的工厂。

适用场景:

  • 简单工厂模式适用于创建简单的对象,例如基于传入参数创建对象的情况。
  • 工厂方法模式适用于需要创建多种具有相同接口的产品,而且每种产品都有对应的工厂。
  • 抽象工厂模式适用于创建一组相关或相互依赖的产品,且每组产品都有对应的工厂。

总之,这三种工厂模式都在不同情况下提供了灵活的对象创建机制,可以根据具体的需求来选择合适的模式。简单工厂模式通常是基础,而工厂方法模式和抽象工厂模式则在更复杂的场景下提供更大的灵活性。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/108314.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wireshark 流量抓包例题重现

[TOC](这里写目录标题 wireshark抓包方法wireshark组成 wireshark例题 wireshark抓包方法 wireshark组成 wireshark的抓包组成为&#xff1a;分组列表、分组详情以及分组字节流。 上面这一栏想要显示&#xff0c;使用&#xff1a;CtrlF 我们先看一下最上侧的搜索栏可以使用的…

LAMP架构详解+构建LAMP平台之Discuz论坛

LAMP架构详解构建LAMP平台之Discuz论坛 1、LAPM架构简介1.1动态资源与语言1.2LAPM架构得组成1.3LAPM架构说明1.4CGI和astcgi1.4.1CGI1.4.2fastcgi1.4.3CGI和fastcgi比较 2、搭建LAMP平台2.1编译安装apache httpd2.2编译安装mysql2.3编译安装php2.4安装论坛 1、LAPM架构简介 1.…

Mysql--技术文档--基本概念--《世界上最流行的关系型数据库之一》

官方网址 MySQL 阿丹&#xff1a; 作为关系型数据库管理的老大哥&#xff0c;一个合格的程序员多多少少一定要了解mysql库。 官方解释 MySQL是一个关系型数据库管理系统&#xff0c;由瑞典MySQL AB 公司开发&#xff0c;属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管…

SpringCache

SpringCache是Spring提供的一个缓存框架&#xff0c;在Spring3.1版本开始支持将缓存添加到现有的spring应用程序中&#xff0c;在4.1开始&#xff0c;缓存已支持JSR-107注释和更多自定义的选项。 Spring Cache利用了AOP&#xff0c;实现了基于注解的缓存功能&#xff0c;并且进…

智慧能源助力绿色发展

居民生活是碳排放的重要贡献源&#xff0c;作为居民生活的主要场所&#xff0c;社区是低碳城市建设的重要空间载体。推动低碳社区建设&#xff0c;逐渐打造低碳生活方式&#xff0c;是低碳社会建设的重要内容之一。智慧新能源公共设施助力碳中和&#xff0c;用于各社区改造&…

CSDN编程题-每日一练(2023-08-27)

CSDN编程题-每日一练&#xff08;2023-08-27&#xff09; 一、题目名称&#xff1a;异或和二、题目名称&#xff1a;生命进化书三、题目名称&#xff1a;熊孩子拜访 一、题目名称&#xff1a;异或和 时间限制&#xff1a;1000ms内存限制&#xff1a;256M 题目描述&#xff1a; …

【广州华锐互动】VR沉浸式体验红军长征路:追寻红色记忆,传承红色精神

在历史的长河中&#xff0c;长征无疑是一段充满艰辛和英勇的伟大征程。为了让更多的人了解这段历史&#xff0c;我们利用虚拟现实&#xff08;VR&#xff09;技术&#xff0c;为您带来一场沉浸式的体验&#xff0c;重温红军万里长征的壮丽篇章。 一、踏上长征之路 戴上VR眼镜&a…

【沐风老师】如何在3dMax中将3D物体转化为样条线构成的对象?

在3dMax中如何把三维物体转化为由样条线构成的对象&#xff1f;通常这样的场景会出现在科研绘图或一些艺术创作当中&#xff0c;下面给大家详细讲解一种3dmax三维物体转样条线的方法。 第一部分&#xff1a;用粒子填充3D对象&#xff1a; 1.创建一个三维对象&#xff08;本例…

linux操作系统的权限的深入学习(未完)

1.Linux权限的概念 Linux下有两种用户&#xff1a;超级用户&#xff08;root&#xff09;、普通用户。 超级用户&#xff1a;可以再linux系统下做任何事情&#xff0c;不受限制 普通用户&#xff1a;在linux下做有限的事情。 超级用户的命令提示符是“#”&#xff0c;普通用户…

华为OD七日集训第2期 - 按算法分类,由易到难,循序渐进,玩转OD(文末送书)

目录 一、适合人群二、本期训练时间三、如何参加四、7日集训第2期五、精心挑选21道高频100分经典题目&#xff0c;作为入门。第1天、逻辑分析第2天、字符串处理第3天、数据结构第4天、递归回溯第5天、二分查找第6天、深度优先搜索dfs算法第7天、动态规划 六、集训总结1、《代码…

SSM框架的学习与应用(Spring + Spring MVC + MyBatis)-Java EE企业级应用开发学习记录(第三天)动态SQL

动态SQL—SSM框架的学习与应用(Spring Spring MVC MyBatis)-Java EE企业级应用开发学习记录&#xff08;第三天&#xff09;Mybatis的动态SQL操作 昨天我们深入学习了Mybatis的核心对象SqlSessionFactoryBuilder&#xff0c;掌握MyBatis核心配置文件以及元素的使用,也掌握My…

java八股文面试[数据结构]——集合框架

Java集合体系框架 Java集合类主要由两个根接口Collection和Map派生出来的。 Collection派生出了三个子接口&#xff1a; Map接口派生&#xff1a; Map代表的是存储key-value对的集合&#xff0c;可根据元素的key来访问value。 因此Java集合大致也可分成List、Set、Queue、Map…

美创科技荣获“2023年网络安全优秀创新成果大赛—杭州分站赛”两项优胜奖

近日&#xff0c;由浙江省互联网信息办公室指导、中国网络安全产业联盟&#xff08;CCIA&#xff09;主办&#xff0c;浙江省网络空间安全协会承办的“2023年网络安全优秀创新成果大赛-杭州分站赛”正式公布评选结果。 经专家评审&#xff0c;美创科技报名参赛的解决方案—“医…

什么是回调函数(callback function)?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 回调函数&#xff08;Callback Function&#xff09;⭐ 示例⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这…

SSM框架的学习与应用(Spring + Spring MVC + MyBatis)-Java EE企业级应用开发学习记录(第五天)MyBatis的注解开发

SSM框架的学习与应用(Spring Spring MVC MyBatis)-Java EE企业级应用开发学习记录&#xff08;第五天&#xff09;MyBatis的注解开发 ​ 昨天我们深入学习了MyBatis多表之间的关联映射&#xff0c;了解掌握了一对一关联映射&#xff0c;一对多关联映射&#xff0c;嵌套查询方…

Python 潮流周刊#17:Excel 终于支持 Python 了、Meta 重磅开源新项目、Mojo 新得 1 亿美元融资

你好&#xff0c;我是猫哥。这里每周分享优质的 Python、AI 及通用技术内容&#xff0c;大部分为英文。标题取自其中两则分享&#xff0c;不代表全部内容都是该主题&#xff0c;特此声明。 本周刊由 Python猫 出品&#xff0c;精心筛选国内外的 250 信息源&#xff0c;为你挑选…

Proteus软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 Proteus软件是一款电路设计和仿真的综合性软件&#xff0c;由Labcenter公司开发。它提供了一个交互式的图形界面&#xff0c;用户可以在其中构建电路、仿真结果并实时观察仿真结果。 1、Proteus的历史和演变 Proteus软件最初于…

Golang struct 结构体注意事项和使用细节

结构体所有字段在内存当中是连续的 type Point struct {x, y int }type Rect struct {leftUp, rightDown Point }func main() {//r1会在内存当中有四个整数r1 : Rect{leftUp: Point{x: 1,y: 2,},rightDown: Point{x: 3,y: 4,},}//r1有四个int&#xff0c;在内存当中是连续分布的…

HTTP 框架修炼之道 | 青训营

Powered by:NEFU AB-IN 文章目录 HTTP 框架修炼之道 | 青训营 走进 HTTP 协议HTTP 框架的设计与实现应用层中间件层路由设计协议层 传输层&#xff08;网络层&#xff09;1. BIO&#xff08;Blocking I/O&#xff09;:2. NIO&#xff08;Non-blocking I/O&#xff09;:区别&…

MyBatis 的关联关系配置 一对多,一对一,多对多 关系的映射处理

目录 一.关联关系配置的好处 二. 导入数据库表&#xff1a; 三. 一对多关系&#xff1a;-- 一个订单对应多个订单项 四.一对一关系&#xff1a;---一个订单项对应一个订单 五.多对多关系&#xff08;两个一对多&#xff09; 一.关联关系配置的好处 MyBatis是一…