Factory-Method

Factory-Method

动机
  • 在软件系统中,经常面临着创建对象的工作;由于需求的变化,需要创建的对象的具体类型经常变化。
  • 如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种“封装机制”来避免客户程序和这种“具体对象创建工作”的紧耦合?
模式定义
  • 定义一个用于创建对象的接口(纯虚基类),让子类决定实例化哪一个类。 Factory使得一个类的实例化延迟(目的:解耦, 手段:虚函数)到子类。
  • 注:自定义1个纯虚工厂基类,其中有个虚方法,它返回我们想要的具体对象,具体实现由具体的工厂子类(工厂子类继承纯虚工厂父类)实现。

在这里插入图片描述

#include <iostream>
#include <string>class Product
{
public:virtual ~Product() {}virtual std::string getName() = 0;// ...
};class ConcreteProductA : public Product
{
public:~ConcreteProductA() {}std::string getName(){return "type A";}// ...
};class ConcreteProductB : public Product
{
public:~ConcreteProductB() {}std::string getName(){return "type B";}// ...
};class Creator
{
public:virtual ~Creator() {}virtual Product *createProductA() = 0;virtual Product *createProductB() = 0;virtual void removeProduct(Product *product) = 0;// ...
};class ConcreteCreator : public Creator
{
public:~ConcreteCreator() {}Product *createProductA(){return new ConcreteProductA();}Product *createProductB(){return new ConcreteProductB();}void removeProduct(Product *product){delete product;}// ...
};int main()
{Creator *creator = new ConcreteCreator();Product *p1 = creator->createProductA();std::cout << "Product: " << p1->getName() << std::endl;creator->removeProduct(p1);Product *p2 = creator->createProductB();std::cout << "Product: " << p2->getName() << std::endl;creator->removeProduct(p2);delete creator;return 0;
}
/*
Product: type A
Product: type B
*/
何时使用
  • 类无法预测它必须创建的对象的类
  • 一个类希望它的子类来指定它创建的对象
总结
  • Factory模式用于隔离类对象的使用者和具体类型之间的耦合关系。面对一个经常变化的具体类型,紧耦合关系(new)会导致软件的脆弱。
  • Factory Method模式通过面向对象的手法,将所要创建的具体对象工作延迟到子类,从而实现一种扩展(而非更改)的策略,较好地解决了这种紧耦合关系。
  • Factory Method模式解决“单个对象”的需求变化。缺点在于要求创建方法/参数相同。

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

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

相关文章

Go 并发编程

并发编程 1.1 并发与并⾏ 并⾏与并发是两个不同的概念&#xff0c;普通解释&#xff1a; 并发&#xff1a;交替做不同事情的能⼒并⾏&#xff1a;同时做不同事情的能⼒ 如果站在程序员的⻆度去解释是这样的&#xff1a; 并发&#xff1a;不同的代码块交替执⾏并⾏&#xf…

蓝桥杯每日一题2023.10.11

子串分值和 - 蓝桥云课 (lanqiao.cn) 题目描述 题目分析 以下为50分方法&#xff08;暴力枚举&#xff09; 第一层循环枚举其长度&#xff0c;第二层循环枚举其左端点&#xff0c;k代表右端点&#xff0c;&#xff08;将每一种子串一一枚举出来&#xff09;算出从左端点到右…

新手教程!制作电子期刊的必备网站

随着数字时代的到来&#xff0c;电子期刊已经成为一种重要的阅读方式。无论是为了学习、工作还是娱乐&#xff0c;电子期刊都以其方便、快捷、多样化的特点&#xff0c;越来越受到人们的欢迎。 对于想要制作电子期刊的新手来说&#xff0c;首先需要找到一些专业的工具来制作电子…

JavaScript和Java的区别是什么?

目录 一、不同的公司开发的不同产品。 二、使用的方向不同 三、对象不同 四、HTML文档中采用的标识不同 五、语言类型不同 六、在浏览器中所执行的方式不同 七、代码格式不同 八、所采取的变量是不同 九、联编方式不一样 十、对图文操作方式不一样 很多初学者看到Jav…

Flink session集群运维

1、集群job manager挂了 kubectl describe pod session-deployment-only-84b8d674c7-ckl9w -n flink kubectl get pod -n flink -owide kubectl describe pod session-deployment-only-84b8d674c7-ms758 -n flink 两个job manager都挂了 准备重新部署集群 删除操作(删除fli…

深度学习基础知识数据 数据预处理transforms流程讲解

深度学习基础知识数据 数据预处理transforms流程讲解 1、数据预处理2、使用节点2、transform.RandomResizedCrop 随机尺寸裁剪缩放3、水平翻转 与 垂直翻转4、ColorJitter变换5、ToTensor6、Normalization 归一化7、transforms.Compose8、重写transforms1、分类任务2、目标检测…

Elasticsearch基础篇(四):Elasticsearch的基础介绍与索引设置

Elasticsearch的基础介绍与索引设置 一、Elasticsearch概述Elasticsearch简介什么是全文检索引擎Elasticsearch 应用案例 二、索引和文档的概念1. 索引&#xff08;Index&#xff09;2. 文档&#xff08;Document&#xff09; 三、倒排索引&#xff08;Inverted Index&#xff…

VS2017+QT+PCL环境配置

1、前置知识 C++ Qt VTK/OPenGL喧杂C 2、环境搭建 1、visual studio 2017安装,从官网上下载对应安装程序。选择C++安装即可 2、Qt安装若是没有账号和密码,选择dont have qt accout? Sign up 根据自己的项目需要选择安装那些组件 2、PCL安装 下载地址:https://github.co…

广州华锐互动:VR互动教学平台如何赋能职业院校?

随着科技的发展&#xff0c;我们的教育方式也在不断进步。其中&#xff0c;虚拟现实&#xff08;VR&#xff09;技术的出现为我们提供了一种全新的教学方式。特别是在职业学校中&#xff0c;VR互动教学平台已经成为一种重要的教学工具。 VR互动教学平台是一种利用虚拟现实技术创…

抖音小店创业攻略,快速了解这些适合新手经营的类目

抖音小店是抖音平台上的一种新型电商形态&#xff0c;它允许用户在抖音上开设自己的小店&#xff0c;销售自己的商品。抖音小店的开设门槛低&#xff0c;成本也不高&#xff0c;因此很受新手创业者的青睐。那么&#xff0c;下面不若与众将介绍抖音小店中有哪些适合新手创业者经…

虹科分享 | 想买车无忧?AR为您带来全新体验!

新能源汽车的蓬勃发展&#xff0c;推动着汽车行业加速进行数字化变革。据数据显示&#xff0c;全球新能源汽车销售额持续上升&#xff0c;预计到2025年&#xff0c;新能源汽车市场规模将达到约 4200亿美元&#xff0c;年复合增长率超过 30%。这表明消费者对清洁能源出行的需求不…

快速学习微服务保护框架--Sentinel

学习一个框架最好的方式就是查看官方地址,sentinel是国内阿里巴巴公司的,官网更方便官网 官网 微服务保护框架 Sentinel 1.初识Sentinel 1.1.雪崩问题及解决方案 1.1.1.雪崩问题 微服务中&#xff0c;服务间调用关系错综复杂&#xff0c;一个微服务往往依赖于多个其它微…