当前位置: 首页 > news >正文

设计模式——工厂模式

目录

简单工厂模式:

工厂模式:

抽象工厂模式:


工厂模式主要有:简单工厂模式、工厂模式、抽象工厂模式;

简单工厂模式:

工厂模式对应的就是一个工厂类。

主要步骤:

  1. 创建一个新的类,可以将这个类称之为工厂类。对于简单工厂模式来说,需要的工厂类只有一个
  2. 在这个工厂类中添加一个公共的成员函数,通过这个函数来创建我们需要的对象,关于这个函数一般将其称之为工厂函数
  3. 关于使用,首先创建一个工厂类对象,然后通过这个对象调用工厂函数,这样就可以生产出一个指定类型的实例对象了。
#include <iostream>
#include <memory>using namespace std;// 产品接口类
class Product {
public:virtual void use() = 0; // 纯虚函数virtual ~Product() = default;
};// 具体产品A
class ProductA : public Product {
public:void use() override {cout << "use the product A" << endl;}
};// 具体产品B
class ProductB : public Product {
public:void use() override {cout << "use the product B" << endl;}
};// 简单工厂类
class Factory {
public:static unique_ptr<Product> createProduct(const string& type) {if(type == "A") {return make_unique<ProductA>();} else if(type == "B") {return make_unique<ProductB>();} else {cout << "no such product" << endl;return nullptr;}}
};// 主函数测试
int main() {auto product1 = Factory::createProduct("A");product1->use();auto product2 = Factory::createProduct("B");product2->use();auto product3 = Factory::createProduct("C");product3->use();return 0;}

从代码中可以看出它是利用一个工厂作为入口,将多个对象的创建和使用分离。它根据传入的参数来创建并返回不同类型的对象实例。

  • 首先是一个产品类接口,应该纯虚函数,方便为下面的具体产品作为一个接口实现;
  • 然后是具体产品类,继承产品类,然后重写产品类中的方法,进行一个具体实现;
  • 最后是实现的简单工厂类,在使用时主要是创建一个工厂类对象,然后通过这个对象调用工厂函数,这样就可以返回出不同类型的对象实例了。

工厂模式:

其实就是在简单工厂模式的基础上对工厂类部分进行了优化;

工厂模式关注的是创建单一类型对象,定义一个抽象方法,由子类实现具体对象的实例化。

工厂方法模式定义了一个创建对象的抽象方法,一个具体的工厂类负责生成一种产品,如果需要添加新的产品,仅需新增对应的具体工厂类而不需要修改原有的代码实现。

#include <iostream>
#include <memory>using namespace std;// 产品接口类
class Product {
public:virtual void use() = 0; // 纯虚函数virtual ~Product() = default;
};// 具体产品A
class ProductA : public Product {
public:void use() override {cout << "use the product A" << endl;}
};// 具体产品B
class ProductB : public Product {
public:void use() override {cout << "use the product B" << endl;}
};// 工厂类-父类
class Factory {
public:virtual unique_ptr<Product> createProduct() = 0;virtual ~Factory() = default;
};// 具体工厂A实现
class FactoryA : public Factory {
public:unique_ptr<Product> createProduct() override {return make_unique<ProductA>();}
};// 具体工厂B实现
class FactoryB : public Factory {
public:unique_ptr<Product> createProduct() override {return make_unique<ProductB>();}
};// 后续工厂补充...// 主函数测试
int main() {unique_ptr<Factory> factory1 =  make_unique<FactoryA>();unique_ptr<Product> product1 = factory1->createProduct();product1->use();unique_ptr<Factory> factory2 =  make_unique<FactoryB>();unique_ptr<Product> product2 = factory2->createProduct();product2->use();return 0;}

通过上面代码可以了解到:

工厂模式相对于简单工厂模式的不同就是将工厂类也写成了纯虚函数作为一个接口类的形式,然后再针对具体的产品来继承该工厂类,并重写其方法实现。后续如果再添加产品的话,不需要像简单工厂里一样在工厂类里面进行修改代码,只需要添加该产品的继承工厂类的代码就可。

在方法的调用中,先使用make_unique<FactoryA>()来创建一个FactoryA的实例,并通过unique_ptr<Factory>管理它。

然后通过factory1调用createProduct()来创建一个ProductA实例。其返回一个unique_ptr<Product>。

抽象工厂模式:

抽象工厂关注的是创建一族相关对象,提供一个接口来创建一组相关的或相互依赖的对象,而无需指定它们的具体类。可以说它是生产了一系列产品。

提供一个工厂基类,然后它有很多工厂子类用来区分不同的需求,另外完成这些不同的需求可能还需要一些东西,所以还有几个抽象类,他们也有不同的子类。

#include <iostream>
#include <memory>// 抽象产品A
class ProductA {
public:virtual void use() = 0;virtual ~ProductA() = default;
};// 具体产品A1
class ConcreteProductA1 : public ProductA {
public:void use() override {std::cout << "Using ConcreteProductA1" << std::endl;}
};// 具体产品A2
class ConcreteProductA2 : public ProductA {
public:void use() override {std::cout << "Using ConcreteProductA2" << std::endl;}
};// 抽象产品B
class ProductB {
public:virtual void eat() = 0;virtual ~ProductB() = default;
};// 具体产品B1
class ConcreteProductB1 : public ProductB {
public:void eat() override {std::cout << "Eating ConcreteProductB1" << std::endl;}
};// 具体产品B2
class ConcreteProductB2 : public ProductB {
public:void eat() override {std::cout << "Eating ConcreteProductB2" << std::endl;}
};// 抽象工厂
class AbstractFactory {
public:virtual std::unique_ptr<ProductA> createProductA() = 0;virtual std::unique_ptr<ProductB> createProductB() = 0;virtual ~AbstractFactory() = default;
};// 具体工厂1
class ConcreteFactory1 : public AbstractFactory {
public:std::unique_ptr<ProductA> createProductA() override {return std::make_unique<ConcreteProductA1>();}std::unique_ptr<ProductB> createProductB() override {return std::make_unique<ConcreteProductB1>();}
};// 具体工厂2
class ConcreteFactory2 : public AbstractFactory {
public:std::unique_ptr<ProductA> createProductA() override {return std::make_unique<ConcreteProductA2>();}std::unique_ptr<ProductB> createProductB() override {return std::make_unique<ConcreteProductB2>();}
};// 客户端
int main() {std::unique_ptr<AbstractFactory> factory1 = std::make_unique<ConcreteFactory1>();auto productA1 = factory1->createProductA();auto productB1 = factory1->createProductB();productA1->use();productB1->eat();std::unique_ptr<AbstractFactory> factory2 = std::make_unique<ConcreteFactory2>();auto productA2 = factory2->createProductA();auto productB2 = factory2->createProductB();productA2->use();productB2->eat();return 0;
}

通过上面代码可以了解到,抽象工厂模式,就是将各个产品也分别进行抽象化,相当于针对一个产品生产了一系列该产品族。

最后调用时同样先生成具体工厂指针实例,然后创建对象调用该具体工厂实例里的createProduct方法来生成具体产品对象进行调用。

抽象工厂模式增加新的产品族较为容易,但是增加新产品类型较为困难。

http://www.dtcms.com/a/473412.html

相关文章:

  • 变色龙哈希与隐私保护
  • 栈和队列:“单端吞吐”VS”双端通行“(第十讲)
  • ros2系统在ubuntu18.04环境下的环境搭建
  • 个人网站展示dw网站制作
  • 鸿蒙NEXT系列之精析NDK UI API(节点增删和属性设置)
  • 10个免费货源网站郑州网络科技公司有哪些
  • Spring 源码学习(十三)—— RequestMappingHandlerAdapter
  • 虚幻引擎虚拟制片入门教程 之 3D渲染基础知识:模型、材质、贴图、UV等
  • excel导出使用arthas动态追踪方法调用耗时后性能优化的过程
  • 【数据结构】强化训练:从基础到入门到进阶(2)
  • python异步编程 -什么是python的异步编程, 与多线程和多进程的区别
  • Linux系统--进程间通信--共享内存相关指令
  • 网站开发的实践报告石家庄市工程勘察设计咨询业协会
  • TensorFlow深度学习实战——图分类
  • SAP MM采购信息记录维护接口分享
  • 网站搭建装修风格大全2021新款简约
  • Mysql初阶第八讲:Mysql表的内外连接
  • SpringCloud 入门 - Gateway 网关与 OpenFeign 服务调用
  • uniapp 选择城市(城市列表选择)
  • AR小白入门指南:从零开始开发增强现实应用
  • 02_k8s资源清单
  • 2025年渗透测试面试题总结-109(题目+回答)
  • uniapp配置自动导入uni生命周期等方法
  • flink的Standalone-HA模式安装
  • Flink时态表关联:实现数据“时间旅行”的终极方案
  • 做哪类英文网站赚钱wordpress 页面 列表
  • nginx + spring cloud + redis + mysql + ELFK 部署
  • 【黑马点评 - 实战篇01】Redis项目实战(Windows安装Redis6.2.6 + 发送验证码 + 短信验证码登录注册 + 拦截器链 - 登录校验)
  • 汕头市通信建设管理局网站二网站手
  • FreeRTOS小记