设计模式 工厂模式

embedded/2024/9/23 7:20:13/

文章目录

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

简单工厂模式简介

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

简单工厂模式结构

工厂类(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/embedded/25524.html

相关文章

【代码问题】【Pytorch】训练模型时Loss为NaN或INF

解决方法或者问题排查&#xff1a; 加归一化层&#xff1a; 我的问题是我新增的一个模块与原来的模块得到的张量相加&#xff0c;原张量是归一化后的&#xff0c;我的没有&#xff1a; class Module(nn.Module):def __init__(self,dim,):super().__init__()# 新增一个LayerNo…

vue3【实用教程】声明响应式状态(含ref,reactive,toRef(),toRefs() 等)

Vue 3 中的数据基于 JavaScript Proxy (代理) 实现响应式 ( vue2 中的数据通过 Object.defineProperty() 方法和对数组变异方法的重写&#xff0c;实现响应式) 选项式 API 用 data 选项声明响应式状态&#xff0c;值为返回一个对象的函数。 在创建组件实例的时候会调用此函数函…

【ARMv9 DSU-120 系列 5 -- CHI Interface】

请阅读【Arm DynamIQ™ Shared Unit-120 专栏 】 文章目录 DSU-120 CHI BUSAddress Target Groups配置步骤映射和管理Hashing for CHI transaction distribution散列过程和地址目标组识别散列函数定义两个地址目标组的散列四个地址目标组的散列八个地址目标组的散列架构框图

va_start 与 va_end

在C语言中&#xff0c;当我们定义一个可变参数的函数时&#xff0c;我们需要一种方法来依次访问每个参数。va_start和va_end宏就是用来处理这些可变参数的。 va_start宏的作用是初始化一个va_list类型的变量&#xff0c;这个变量是用来存储和访问可变参数的。va_start应该在函…

数据结构-树和森林之间的转化

从树的二叉链表的定义可知&#xff0c;任何一棵和树对应的二叉树&#xff0c;其根节点的右子树必为空。这里我们举三个树&#xff0c;将这个由三个树组成的森林组成二叉树是这个样子的。 下面我们说明一下详细过程&#xff0c;首先将每个树转化为二叉的状态&#xff0c;如图所示…

linux jmeter ant下载并安装【2024-亲测】

环境 centos7 一、下载jmeter 在这里插入代码片wget https://dlcdn.apache.org//jmeter/binaries/apache-jmeter-5.6.3.tgz --no-check-certificate解压 tar -zxvf apache-jmeter-5.6.3.tgz复制到安装目录、设置环境变量 vim /etc/profile添加环境变量&#xff0c;路径改成…

数据结构_时间复杂度

✨✨所属专栏&#xff1a;数据结构✨✨ ✨✨作者主页&#xff1a;嶔某✨✨ 什么是时间复杂度&#xff1f; 时间复杂度的定义&#xff1a;在计算机科学中&#xff0c;算法的时间复杂度是一个函数&#xff0c;它定量描述了该算法的运行时间。一个算法执行所耗费的时间&#xff0…

Python来计算 1,2,3,4 能组成多少个不相同且不重复的三位数?

我们今天的例子是 有 1&#xff0c;2&#xff0c;3&#xff0c;4 四个数字&#xff0c;它们能组成多省个互不相同且无重复的三位数&#xff1f;都分别是多少&#xff1f; 话不多说&#xff0c;我们先上代码 num 0 # 我们写了三个for循环&#xff0c;表示生成的三位数 for i…