设计模式3、工厂方法模式 Factory Method

news2024/11/25 3:18:42
解释说明:定义一个用于创建对象的接口,但是让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类
抽象工厂(AbstractFactory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法来创建产品
具体工厂(ConcreteFactory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建
抽象产品(Product):定义产品的规范,描述了产品的主要特性和功能
具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间是一对一的关系
优点:
    克服了简单工厂模式违背开放-封闭原则的缺点,又保留了封装对象创建过程的优点,降低客户端和工厂的耦合性。所以说,“工厂方法模式”是“简单工厂模式”的进一步抽象和推广。
缺点:
    每增加一个产品,相应的也要增加一个子工厂,加大了额外的开发量
适用场景
    对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来。
只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂生产的,即最终选用哪个具体工厂的决定权在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使用者,而这个决策过程对于使用者来说是透明的
考虑这样一个场景,如下图:
    Jungle想要进行户外运动,它可以选择打篮球、踢足球或者玩排球。和上一次的体育保管室不同,这次分别由篮球保管室、足球保管室和排球保管室,Jungle只需直接去相应的保管室就可以拿到对应的球!然后Jungle就可以愉快地玩耍了
product.h
#pragma once
#include <string>
using namespace std;
// 汽车接口
class ICar
{
public:
   virtual string Name() = 0;  // 汽车名称
};
concreteProduct.h
#pragma once
#include "product.h"
// 奔驰汽车
class BenzCar : public ICar
{
public:
   string Name()
   {
       return "Benz Car";
   }
};
// 宝马汽车
class BmwCar : public ICar
{
public:
   string Name()
   {
       return "Bmw Car";
   }
};
// 奥迪汽车
class AudiCar : public ICar
{
public:
   string Name()
   {
       return "Audi Car";
   }
};
factory.h
#pragma once
#include "product.h"
// 工厂接口
class AFactory
{
public:
   virtual ICar* CreateCar() = 0;  // 生产汽车
};
concreteProduct.h
#pragma once
#include "factory.h"
#include "concreteProduct.h"
// 奔驰工厂
class BenzFactory : public AFactory
{
public:
   ICar* CreateCar()
   {
       return new BenzCar();
   }
};
// 宝马工厂
class BmwFactory : public AFactory
{
public:
   ICar* CreateCar()
   {
       return new BmwCar();
   }
};
// 奥迪工厂
class AudiFactory : public AFactory
{
public:
   ICar* CreateCar()
   {
       return new AudiCar();
   }
};
main.cpp
#include "concreteFactory.h"
#include "product.h"
#include <iostream>
#ifndef SAFE_DELETE
#define SAFE_DELETE(p) { if(p){delete(p); (p)=NULL;} }
#endif
int main()
{
   // 奔驰
   AFactory *pFactory = new BenzFactory();
   ICar *pCar = pFactory->CreateCar();
   cout << "Benz factory: " << pCar->Name() << endl;
   SAFE_DELETE(pCar);
   SAFE_DELETE(pFactory);
   // 宝马
   pFactory = new BmwFactory();
   pCar = pFactory->CreateCar();
   cout << "Bmw factory: " << pCar->Name() << endl;
   SAFE_DELETE(pCar);
   SAFE_DELETE(pFactory);
   // 奥迪
   pFactory = new AudiFactory();
   pCar = pFactory->CreateCar();
   cout << "Audi factory: " << pCar->Name() << endl;
   SAFE_DELETE(pCar);
   SAFE_DELETE(pFactory);
   system("pause");
   return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2009-2018年31省份旅游收入(入境、国内、总收入;第三产值;GDP)

2009&#xff0d;2018年31省份旅游收入&#xff08;入境、国内、总收入&#xff1b;第三产值&#xff1b;GDP&#xff09; 1、时间&#xff1a;2009-2018年 2、指标&#xff1a; 汇率、入境旅游收入&#xff08;万美元&#xff09;、国内旅游收入&#xff08;亿元&#xff0…

REASUNOS瑞森半导体-MOS管系列在服务器电源上的应用

一、前言 服务器电源是指使用在服务器上的电源&#xff08;POWER&#xff09;&#xff0c;它和PC电源一样&#xff0c;都是一种开关电源&#xff0c;指能够将交流电转换为服务器所需直流电的电源。 服务器电源按照标准可以分为ATX电源和SSI电源等。ATX标准使用较为普遍&…

DAP-seq在植物转录因子的应用案例助你打通研究思路

众所周知&#xff0c;转录因子 (Transcription Factors, TFs)是指能够以序列特异性方式结合DNA并且调节转录的蛋白质。TF与特异性DNA序列结合调节转录&#xff0c;同时会和其它功能蛋白结合调控下游基因的转录和翻译过程&#xff0c;也会和增强子等其它顺式作用元件结合&#x…

MySQL基础篇-基本sql语句

目录 1.SQL分类 2.SQL-DDL 2.1 数据库操作 查询 创建 删除 使用某个数据库 2.2 数据表操作 创建表 查询表 修改表 3.SQL-DML(增删改) 3.1 插入 3.2 修改 3.3 删除 4.SQL-DQL(查) 4.1 基础查询 4.2 条件查询 4.3 聚合函数查询 4.4 分组查询 4.5 排序查询 …

在EXCEL中构建加载项之创建加载项的目的及规范要求

【分享成果&#xff0c;随喜正能量】一句南无阿弥陀佛&#xff0c;本是释迦牟尼佛所证的无上正等正觉法&#xff0c;洒在娑婆世界的众生海中&#xff0c;只为末世众生能够以信愿之心抓住此救命稻草&#xff0c;要知道今世人此生的处境&#xff0c;可能只剩这道要么极乐要么三涂…

C++之 lambda表达式

lambda表达式 lambda表达式概念lambda表达式语法lambda表达式底层原理 lambda表达式概念 我们在以往需要对某些数据进行排序时&#xff0c;比如一个数组&#xff0c;我们就需要用到sort()函数&#xff1a; int main() {int arr[] { 3,1,2,4,8,7,5,9 };//升序sort(arr, arr …

day36-xml

1.xml 1.1概述【理解】 万维网联盟(W3C) 万维网联盟(W3C)创建于1994年&#xff0c;又称W3C理事会。1994年10月在麻省理工学院计算机科学实验室成立。 建立者&#xff1a; Tim Berners-Lee (蒂姆伯纳斯李)。 是Web技术领域最具权威和影响力的国际中立性技术标准机构。 到目前为…

使用 KerasCV YOLOv8 进行物体检测--附完整实现源码

YOLO 目标检测模型已应用于无数应用,从监控系统到自动驾驶车辆。但是,当在 KerasCV 框架下将 YOLOv8 的这种能力配对时会发生什么呢?最近,KerasCV 将著名的 YOLOv8 检测模型集成到其库中。在本文中,我们将探讨如何使用自定义数据集微调 YOLOv8。在此过程中,我们还将涵盖以…

wireshark of tshark tools v3.4.0版本 支持json

tshark(1) Install tshark (Wireshark) Ver.3.4.0 on CentOS7 --It must be "ps", "text", "pdml", "psml" or "fields". TCP 协议中的三次握手和四次挥手是 TCP 连接建立和关闭的过程。 三次握手 客户端向服务器发送 SYN…

Java自学(二)

目录 一、数组逆置&#xff08;临时变量法&#xff09; 二、基本类型和引用类型传参的区别 一、数组逆置&#xff08;临时变量法&#xff09; 二、基本类型和引用类型传参的区别 基本类型传参&#xff0c;形参一般不会改变实参。 形参是实参的一份数据拷贝&#xff0c;改变形…

Android12之解封装NuMediaExtractor::setDataSource过程(四十七)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…

Python之网络协议

一、网络通信协议 国际标准化组织(ISO,即International Organization for Standardization)定义了网络通信协议的基本框架,被称为OSI(Open System Interconnect,即开放系统互联)模型。要制定通讯规则,内容会很多,比如要考虑A电脑如何找到B电脑,A电脑在发送信息给B电脑时…

十五、异常(3)

本章概要 捕获所有异常 多重捕获栈轨迹重新抛出异常精准的重新抛出异常异常链 捕获所有异常 可以只写一个异常处理程序来捕获所有类型的异常。通过捕获异常类型的基类 Exception&#xff0c;就可以做到这一点&#xff08;事实上还有其他的基类&#xff0c;但 Exception 是所…

中秋节快乐

中秋节快乐&#xff0c;国庆节快乐

61从零开始学Java之处理大数字相关的类有哪些?

作者&#xff1a;孙玉昌&#xff0c;昵称【一一哥】&#xff0c;另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 我们知道&#xff0c;在现实世界里&#xff0c;实际上数字是有无穷个的&#xff0c;就比如0和1之间&a…

不同材质地下管线的地质雷达响应特征分析

不同材质地下管线的地质雷达响应特征分析 前言 建立了不同材质地下管线&#xff08;铸铁管线&#xff08;PEC&#xff09;、混凝土管线、PVC/PE管线&#xff09;的二维模型&#xff0c;进行二维地质雷达正演模拟&#xff0c;分析不同材质管线的地质雷达响应特征。 文章目录 …

[chrome devtools]Sources面板

Source面板左侧部分内容&#xff1a; 下面解释每一项&#xff1a; Page&#xff1a;显示当前页面所有已加载的资源Filesystem&#xff1a;将本地代码拖进来&#xff0c;作为一个workspace&#xff0c;可以直接在这里面编辑代码&#xff0c;然后页面就可以直接看到效果&#xf…

【计算机网络】详解TCP协议(上) TCP协议头结构 | ACK确认应答 | 超时重传机制

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 更多计算机网络知识专栏&#xff1a;计算机网络&#x1f525; 给大家跳段…

深入理解服务发现:从基础到实践

随着微服务架构的广泛应用&#xff0c;服务发现已经成为了一个不可或缺的组成部分。服务发现是微服务架构中的一个关键问题&#xff0c;它涉及到如何管理和协调在一个分布式系统中的大量服务。本文将深入探讨服务发现的基本概念、工作原理和实践应用。我们将首先介绍服务发现的…

怎么使用 Go 语言操作 Apache Doris

Apache Doris 是一个基于 MPP 架构的高性能、实时的分析型数据库&#xff0c;以极速易用的特点被人们所熟知&#xff0c;仅需亚秒级响应时间即可返回海量数据下的查询结果&#xff0c;不仅可以支持高并发的点查询场景&#xff0c;也能支持高吞吐的复杂分析场景。基于此&#xf…