设计模式之简单工厂模式、工厂模式、抽象工厂模式

参考: 设计模式笔记

简单工厂模式

● 将类的创建过程交给工厂类实现,如果需要一个类对象,则直接通过工厂创建一个类。
● 简单工厂模式不符合开闭原则
● 适用场景:工厂类负责创建的对象比较少;客户端只知道传入工厂类的参数,对于如何创建对象不关心

/*
类的创建过程交给工厂类来实现,如果需要一个类的对象,则直接通过工厂创建一个对应的类对象
*/
#include<iostream>
using namespace std;
class AbstractFruit{
public:virtual void showName()=0;
};//苹果
class Apple:public AbstractFruit{
public:virtual void showName(){cout<<"i am a appple"<<endl;}
};
//香蕉
class Banana:public AbstractFruit{
public:virtual void showName(){cout<<"i am a banana"<<endl;}
};//水果工厂
class FruitFactory{
public:static AbstractFruit*createFruit(string type){if(type=="apple"){return new Apple();}else if(type=="banana"){return new Banana();}else return nullptr;}
};int main(){FruitFactory*factory=new FruitFactory();AbstractFruit*fruit=factory->createFruit("apple");fruit->showName();//i am a apppledelete fruit;fruit=factory->createFruit("banana");fruit->showName();//i am a bananadelete fruit;delete factory;return 0;}

工厂模式(简单工厂模式+开闭原则)

● 代码扩展时不需要修改工厂类
● 类急速膨胀,不利于维护
● 适用场景:消费者不关心它所要创建的产品类;或者知道要创建的产品类二不关心如何创建的时候

/*简单工厂模式+开闭原则
*/
#include<iostream>
using namespace std;
class AbstractFruit{
public:virtual void showname()=0;
};class Apple:public AbstractFruit{
public:virtual void showname(){cout<<"i am a apple"<<endl;}
};class Banana:public AbstractFruit{
public:virtual void showname(){cout<<"i am a banana"<<endl;}
};
class Orange:public AbstractFruit{
public:virtual void showname(){cout<<"i am an orange"<<endl;}
};//之前是水果工厂,如果要添加对象都会在工厂里面添加,破坏了开闭原则
//设计成抽象工厂
class AbstractFactory{
public:virtual AbstractFruit*createFruit()=0;};//苹果工厂
class AppleFactory:public AbstractFactory{
public:virtual AbstractFruit*createFruit(){return new Apple();}
};//香蕉工厂
class BananaFactory:public AbstractFactory{
public:virtual AbstractFruit*createFruit(){return new Banana();}
};
//橙子工厂
class OrangeFactory:public AbstractFactory{
public:virtual AbstractFruit*createFruit(){return new Orange();}
};int main(){AbstractFactory*factory=new AppleFactory();AbstractFruit*fruit=factory->createFruit();fruit->showname();//i am a appledelete factory;delete fruit;factory=new BananaFactory();fruit=factory->createFruit();fruit->showname(); //i am a bananadelete factory;delete fruit;factory=new OrangeFactory();fruit=factory->createFruit();fruit->showname();//i am an orangedelete factory;delete fruit;return 0;}

抽象工厂模式(增加产品族方便)

● 产品族:同一产地或者同一产商,功能不同
● 产品等级:功能相同,产地或者产商不同
● 不符合开闭原则,增加新的产品等级麻烦,甚至要在抽象层修改代码
● 适用场景:

  1. 系统中有多于一个的产品族。而每次只使用其中某一产品族。可以通过配置文件等方式来使得用户可以动态改变产品族,也可以很方便地增加新的产品族。
  2. 产品等级结构稳定。设计完成之后,不会向系统中增加新的产品等级结构或者删除已有的产品等级结构。
/*针对产品族而不是产品等级结构
*/
#include<iostream>
using namespace std;
//抽象产品等级
class AbstractApple{
public:virtual void showname()=0;
};
class AbstractBanana{
public:virtual void showname()=0;
};
//具体产品等级
//武汉苹果
class AppleFromWhuhan:public AbstractApple{
public:virtual void showname(){cout<<" apple frome whuhan"<<endl;}
};
//上海苹果
class AppleFromShanghai:public AbstractApple{
public:virtual void showname(){cout<<" apple frome shanghai"<<endl;}
};
//武汉香蕉
class BananaFromWhuhan:public AbstractBanana{
public:virtual void showname(){cout<<" banana frome whuhan"<<endl;}
};
//上海香蕉
class BananafromShanghai:public AbstractBanana{
public:virtual void showname(){cout<<"banana frome shanghai"<<endl;}
};
//抽象工厂
class AbstractFactory{
public :virtual AbstractApple*createApple()=0;virtual AbstractBanana*createBanana()=0;};
//武汉工厂
class WhuhanFactory:public AbstractFactory{
public:AbstractApple*createApple(){return new AppleFromWhuhan();}AbstractBanana*createBanana(){return new BananaFromWhuhan();}
};
//上海工厂
class ShanghaiFactory:public AbstractFactory{
public:AbstractApple*createApple(){return new AppleFromShanghai();}AbstractBanana*createBanana(){return new BananafromShanghai();}
};int main(){AbstractFactory*factory=nullptr;AbstractApple*apple=nullptr;AbstractBanana*banana=nullptr;//武汉苹果和香蕉factory=new WhuhanFactory();apple=factory->createApple();banana=factory->createBanana();apple->showname();// apple frome whuhanbanana->showname();// banana frome whuhandelete factory;delete apple;delete banana;//上海苹果和香蕉factory=new ShanghaiFactory();apple=factory->createApple();banana=factory->createBanana();apple->showname();// apple frome shanghaibanana->showname();//banana frome shanghaidelete factory;delete apple;delete banana;
}

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

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

相关文章

shell命令

#!/bin/bash read -p "请输入一个文件名&#xff1a;" fileName posexpr index $fileName \. typeexpr substr $fileName $((pos1)) 2if [ $type sh ] thenif [ -x $fileName ]thenbash $fileNameelsechmod ax $fileNamefi firead -p "请输入第一个文件名&…

运输层---概述

目录 运输层主要内容一.概述和传输层服务1.1 概述1.2 传输服务和协议1.3 传输层 vs. 网络层1.4 Internet传输层协议 二. 多路复用与多路分解&#xff08;解复用&#xff09;2.1 概述2.2 无连接与面向连接的多路分解&#xff08;解复用&#xff09;2.3面向连接的多路复用*2.4 We…

区块链智能合约代码示例

以下是一个简单的区块链智能合约代码示例&#xff1a; pragma solidity ^0.4.17;contract SimpleContract {uint public myData;function setMyData(uint newData) public {myData newData;} }该合约具有以下功能&#xff1a; 定义了一个名为 SimpleContract 的合约。定义了一…

arcgis字段计算器

1、两字段叠加。要求待叠加的字段类型为文本或字符串类型。如下&#xff1a; 2、字符串部分提取。

坚鹏:中国邮储银行金融科技前沿技术发展与应用场景第2期培训

中国邮政储蓄银行金融科技前沿技术发展与应用场景第2期培训圆满结束 中国邮政储蓄银行拥有优良的资产质量和显著的成长潜力&#xff0c;是中国领先的大型零售银行。2016年9月在香港联交所挂牌上市&#xff0c;2019年12月在上交所挂牌上市。中国邮政储蓄银行拥有近4万个营业网点…

java工厂设计模式

Java中的工厂设计模式是一种创建型设计模式&#xff0c;它提供了一种将对象的创建逻辑抽象出来的方法&#xff0c;使得客户端代码不需要直接实例化具体的类&#xff0c;而是通过一个共同的接口来创建对象。这样可以降低代码之间的耦合性&#xff0c;提高代码的可维护性和可扩展…

性能测试怎么做?测试工具怎么选择?

在当前软件测试行业&#xff0c;熟练掌握性能测试已经是测试工程师们面试的敲门砖了&#xff0c;当然还有很多测试朋友们每天的工作更多的是点点点&#xff0c;性能方面可能也只是做过简单的并发测试&#xff0c;对于编写脚本&#xff0c;搭建环境方面也比较陌生。今天这篇文章…

暑假刷题第20天--8/3

B-序列的与和_2023河南萌新联赛第&#xff08;四&#xff09;场&#xff1a;河南大学 (nowcoder.com)&#xff08;dfs&#xff09; #include<iostream> #include<string> using namespace std; #define ull unsigned long long int n,k; ull a[21]; ull ans0; int…

物联网工程开发实施,应该怎么做?

我这里刚好有嵌入式、单片机、plc的资料需要可以私我或在评论区扣个6 物联网工程的概念 物联网工程是研究物联网系统的规划、设计、实施、管理与维护的工程科学&#xff0c;要求物联网工程技术人员根 据既定的目标&#xff0c;依照国家、行业或企业规范&#xff0c;制定物联网…

Delphi Architect Crack,部署支持Swagger

Delphi Architect Crack,部署支持Swagger 单一代码库-用更少的编码工作为所有主要平台创建应用程序。写一次&#xff0c;到处编译。 Windows-使用最新的用户界面控件、WinRT API和HighDPI相关功能&#xff0c;使Windows的VCL应用程序现代化。 远程桌面-使用改进的VCL和IDE远程桌…

图的深度、广度优先探索(数据结构)

深度&#xff1a; #include <stdio.h> #include <stdlib.h> #define MAX 20typedef struct ANode {int adjver,len;struct ANode*next; } ArcNode;typedef struct VNode {int data;ArcNode*firstarc; } VertexNode;typedef struct {VertexNode vers[MAX1];int ver…

使用Nmap的简单教程

Nmap是一个开源的网络探测和安全审核工具。它可以用于扫描网络上的主机和服务&#xff0c;识别开放的端口、操作系统信息等。 1、 下载和安装Nmap&#xff1a;从Nmap官方网站&#xff08;https://nmap.org/&#xff09;下载适用于Windows的Nmap安装程序。运行安装程序并按照指…

763. 划分字母区间

763. 划分字母区间 给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段&#xff0c;同一字母最多出现在一个片段中。 注意&#xff0c;划分结果需要满足&#xff1a;将所有划分结果按顺序连接&#xff0c;得到的字符串仍然是 s 。 返回一个表示每个字符串片段的长度…

http请求头信息说明

协议头 说明 示例 状态 Accept 可接受的响应内容类型&#xff08;Content-Types&#xff09;。 Accept: text/plain 固定 Accept-Charset 可接受的字符集 Accept-Charset: utf-8 固定 Accept-Encoding 可接受的响应内容的编码方式。 Accept-Encoding: gzip, defl…

R语言glmnet包详解:横截面数据建模

R语言glmnet包详解:横截面数据建模 glmnet适用的模型glmnet建模补充glmnet适用的模型 glmnet程序包即适用于线性模型,也适用于添加惩罚项项的线性模型。如果数据中的变量个数大于样本量并且想用线性模型解决问题,那么glmnet再合适不过了! 根据glmnet函数中参数family的指定…

【C++进阶知识】04 - 函数默认实参、默认初始化、initializer_list

1. 函数默认实参 默认实参需要注意以下几点&#xff1a; &#xff08;1&#xff09;函数默认实参的赋值应从右往左&#xff0c;否则编译报错&#xff0c;因为参数入栈应该从右往左。 void f(int, int, int 1); void f(int, int 2, int); void f(int 3, int, int);&#x…

chrome插件开发实例02-使用content_scripts对用户浏览页面操作

目录 引言 chrome插件 插件演示 源代码 manifest.json content_scripts.js css设置(放在css文件夹下)<

【二等奖方案】Web攻击检测与分类识别赛题「机器学习」团队解题思路

2022 CCF BDCI 数字安全公开赛 赛题「Web攻击检测与分类识别」 地址&#xff1a;http://go.datafountain.cn/4Zj 机器学习战队 获奖方案 团队简介 我们团队由五名成员组成&#xff0c;对机器学习都非常感兴趣&#xff0c;同时在机器学习领域有着丰富的实战经验&#xff0c…

C# wpf程序

--App.xaml namespace WpfMyproject { /// <summary> /// App.xaml 的交互逻辑 /// </summary> public partial class App : PrismApplication { protected override Window CreateShell() { return Container.R…

2023年下半年软考报名时间及汇总(附报名流程图)

2023下半年软考考试时间为11月4、5日&#xff0c;2023年下半年软考全国报名平台入口8月14日开通&#xff0c;由此可知各地报名时间将会从8月14日起陆续开始。千万别错过报名了哦&#xff01;这几天要多关注&#xff01; 2023年下半年软考考试安排各科目考试时间已定&#xff0…