设计模式 工厂模式

ops/2024/10/22 14:26:00/

文章目录

  • 简单工厂模式简介
  • 简单工厂模式结构
  • 简单工厂模式实现
  • 工厂模式简介
  • 工厂模式结构
  • 工厂模式实现
  • 抽象工厂模式简介
  • 抽象工厂模式结构
  • 抽象工厂模式实现

简单工厂模式简介

简单工厂模式通过一个专门的工厂类来负责对象的创建,客户端只需要提供工厂类需要的参数,然后工厂类就会根据这些参数来创建相应的对象,客户无需了解对象创建的逻辑。

简单工厂模式结构

工厂类(Factory):负责创建对象的类。它包含一个方法,根据客户端传递的参数来决定创建哪种类型的对象。

产品类(Product):被创建的对象的抽象类或接口。它定义了对象的基本属性和行为,具体的产品类将实现这些抽象方法。

具体产品类(Concrete Product):实现了产品类的具体子类。它是工厂类创建的对象的实际类型。

枚举:用于规范传参种类,可以不写。
在这里插入图片描述

简单工厂模式实现

#include <iostream>
#include <string>// 产品类 - 抽象类或接口
class Product 
{
public:virtual void use() = 0;
};// 具体产品类A
class ConcreteProductA : public Product 
{
public:void use() override {std::cout << "使用A产品" << std::endl;}
};// 具体产品类B
class ConcreteProductB : public Product 
{
public:void use() override {std::cout << "使用B产品" << std::endl;}
};// 工厂类
class Factory 
{
public:// 根据类型创建产品static Product* createProduct(const std::string& type) {// 也可用case语句--效率更高if (type == "A") {return new ConcreteProductA();} else if (type == "B") {return new ConcreteProductB();} else {return nullptr; // 可以考虑抛出异常或返回默认产品}}
};int main() 
{// 使用工厂创建产品Product* productA = Factory::createProduct("A");if (productA) {productA->use();delete productA;}Product* productB = Factory::createProduct("B");if (productB) {productB->use();delete productB;}return 0;
}

工厂模式简介

在简单工厂模式的基础上进行了优化,从简单工厂模式的类图或代码中可以看出,如果程序设计者想设计新的产品,就要在工厂类中增加新的代码,这样如果更新产品较多就会造成工厂类代码长度过长,且因为要修改已有的代码,开发封闭原则实现程度较低(绝对的开放封闭不存在)。 使用工厂模式则可以解决这些问题。

工厂模式结构

抽象工厂(Abstract Factory):定义了创建产品对象的接口。

具体工厂(Concrete Factory):实现了抽象工厂接口,负责创建具体的产品对象。

抽象产品(Abstract Product):定义了产品的基本属性和行为。

具体产品(Concrete Product):实现了抽象产品接口,是具体的产品对象。

每种具体工厂对应一个具体产品。

在这里插入图片描述

工厂模式实现

#include <iostream>
#include <memory>// 抽象产品
class Product 
{
public:virtual void operation() = 0;virtual ~Product() {}
};// 具体产品 A
class ConcreteProductA : public Product 
{
public:void operation() override {std::cout << "具体产品 A 的操作" << endl ;}
};// 具体产品 B
class ConcreteProductB : public Product 
{
public:void operation() override {std::cout << "具体产品 B 的操作" << endl;}
};// 抽象工厂
class Factory 
{
public:virtual std::unique_ptr<Product> createProduct() = 0;virtual ~Factory() {}
};// 具体工厂 A
class ConcreteFactoryA : public Factory {
public:std::unique_ptr<Product> createProduct() override {return std::make_unique<ConcreteProductA>();}
};// 具体工厂 B
class ConcreteFactoryB : public Factory 
{
public:std::unique_ptr<Product> createProduct() override {return std::make_unique<ConcreteProductB>();}
};int main() 
{// 创建工厂 Astd::unique_ptr<Factory> factoryA = std::make_unique<ConcreteFactoryA>();// 使用工厂 A 创建产品 Astd::unique_ptr<Product> productA = factoryA->createProduct();productA->operation();// 创建工厂 Bstd::unique_ptr<Factory> factoryB = std::make_unique<ConcreteFactoryB>();// 使用工厂 B 创建产品 Bstd::unique_ptr<Product> productB = factoryB->createProduct();productB->operation();delete factoryA ;delete productA ;delete factoryB ;delete productB ; return 0;
}

抽象工厂模式简介

和工厂模式结构类似,只不过多做了一层虚拟接口类。抽象工厂和工厂的区别在于选择使用上:
工厂模式使用情境:
1当一个类不知道它所必须创建的对象的类的时候
2当一个类希望由它的子类来指定它所创建的对象的时候
3当类将创建对象的职责委托给多个帮助子类中的某一个,并且你望将哪一个帮助子类是代理者这一信息局部化的时候,
抽象工厂模式使用情境:
1当需要创建的对象是一系列相互关联或相互依赖的产品族的时候
2当系统需要独立于它的产品的创建、组合和表示的时候。
3当一个系统要由多个产品系列中的一个来配置时。

抽象工厂模式结构

抽象工厂(图中 工厂接口类): 这是工厂模式的核心,它定义了一个创建一组产品的接口。

具体工厂(图中 具体工厂): 实现了抽象工厂接口,生产一组具体的产品。

抽象产品(图中 产品–接口类): 定义了一个产品对象的接口。

具体产品(图中 部件A1A2…C2C3): 实现了抽象产品接口,是具体工厂创建的具体对象。

在这里插入图片描述

抽象工厂模式实现

// 抽象产品A
class AbstractProductA 
{
public:virtual std::string Operation() const = 0;
};// 具体产品A1
class ConcreteProductA1 : public AbstractProductA 
{
public:std::string Operation() const override {return "ConcreteProductA1";}
};// 具体产品A2
class ConcreteProductA2 : public AbstractProductA 
{
public:std::string Operation() const override {return "ConcreteProductA2";}
};// 抽象产品B
class AbstractProductB 
{
public:virtual std::string OperationB() const = 0;
};// 具体产品B1
class ConcreteProductB1 : public AbstractProductB 
{
public:std::string OperationB() const override{return "ConcreteProductB1";}
};// 具体产品B2
class ConcreteProductB2 : public AbstractProductB 
{
public:std::string OperationB() const override {return "ConcreteProductB2";}
};// 抽象工厂
class AbstractFactory 
{
public:virtual AbstractProductA* CreateProductA() const = 0;virtual AbstractProductB* CreateProductB() const = 0;
};// 具体工厂1
class ConcreteFactory1 : public AbstractFactory 
{
public:AbstractProductA* CreateProductA() const override{return new ConcreteProductA1();}AbstractProductB* CreateProductB() const override {return new ConcreteProductB1();}
};// 具体工厂2
class ConcreteFactory2 : public AbstractFactory 
{
public:AbstractProductA* CreateProductA() const override {return new ConcreteProductA2();}AbstractProductB* CreateProductB() const override {return new ConcreteProductB2();}
};// 客户端代码
void ClientCode(const AbstractFactory& factory) 
{const auto product_a = factory.CreateProductA();const auto product_b = factory.CreateProductB();std::cout << product_a->Operation() << "\n";std::cout << product_b->OperationB() << "\n";delete product_a;delete product_b;
}int main() 
{std::cout << "Client: Testing client code with the first factory type:\n";ConcreteFactory1 factory1;ClientCode(factory1);std::cout << "\n";std::cout << "Client: Testing the same client code with the second factory type:\n";ConcreteFactory2 factory2;ClientCode(factory2);return 0;
}

http://www.ppmy.cn/ops/37106.html

相关文章

scrapy常用命令总结

1.创建scrapy项目的命令&#xff1a;     scrapy startproject <项目名字> 示例&#xff1a;     scrapy startproject myspider 2.通过命令创建出爬虫文件&#xff0c;爬虫文件为主要的代码文件&#xff0c;通常一个网站的爬取动作都会在爬虫文件中进行编写。 …

Linux: module: 删除时的两难境地CONFIG_MODULE_FORCE_UNLOAD

CONFIG_MODULE_FORCE_UNLOAD 这个配置,一般是不设置。所以下面这个函数的定义,走到else,就是一直返回:0。 #ifdef CONFIG_MODULE_FORCE_UNLOAD static inline int try_force_unload(unsigned int flags) {int ret = (flags & O_TRUNC);

数据结构——链表专题3

文章目录 一、判断链表是否有环二、返回入环的第一个节点三、随机链表的复制 一、判断链表是否有环 原题链接&#xff1a;判断链表是否有环 这道题可以使用快慢指针&#xff0c;fast一次走两步&#xff0c;slow一次走一步&#xff0c;如果有环&#xff0c;它们在环里面必定会…

【代码Demo】SpringBoot+Redis+定时任务模拟手机短信验证

目录 说明需求代码实现1.依赖2.Controller3.service3.1常量设定3.2判断获取次数3.3判断验证码剩余时间3.4获取验证码3.5保存验证码&#xff0c;设置有效期&#xff0c;累加获取次数3.6校验手机号与验证码service层完整代码 4.设置定时任务&#xff0c;每天0点清除所有短信获取次…

minio getPresignedObjectUrl(GetPresignedObjectUrlArgs args)如何使用

在MinIO Java SDK中&#xff0c;getPresignedObjectUrl 方法现在接受一个 GetPresignedObjectUrlArgs 对象作为参数&#xff0c;这个对象允许你更加灵活地配置生成预签名URL的行为。以下是使用这个方法的一个示例&#xff1a; 首先&#xff0c;确保你已经添加了MinIO Java SDK…

Mybatis入门

我们要 使用Mapper代理方式完成Mybatis入门 第一步&#xff1a;在mysql中创建一张user1表&#xff0c;并添加数据。 create table user1 (id int primary key auto_increment,name varchar(20) not null,sex char default 男,address varchar(20) ); insert into user1 (id,…

iptables---防火墙

防火墙介绍 防火墙的作用可以理解为是一堵墙&#xff0c;是一个门&#xff0c;用于保护服务器安全的。 防火墙可以保护服务器的安全&#xff0c;还可以定义各种流量匹配的规则。 防火墙的作用 防火墙具有对服务器很好的保护作用&#xff0c;入侵者必须穿透防火墙的安全防护…

学习和分析各种数据结构所要掌握的一个重要知识——CPU的缓存利用率(命中率)

什么是CPU缓存利用率&#xff08;命中率&#xff09;&#xff0c;我们首先要把内存搞清楚。 硬盘是什么&#xff0c;内存是什么&#xff0c;高速缓存是什么&#xff0c;寄存器又是什么&#xff1f; 我们要储存数据就要运用到上面的东西。首先里面的硬盘是可以无电存储的&#…