设计模式---4(抽象工厂模式的概念,产品组和产品等级的概念,抽象工厂模式的实现)

抽象工厂模式

抽象工厂模式的概念

抽象工厂模式是所有形态的工厂模式中最为抽象和最其一般性的。抽象工厂模式可以向 客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品 族的产品对象

抽象工厂的角色及其职责

在这里插入图片描述

  1. 抽象工厂(Creator)角色 抽象工厂模式的核心,包含对多个产品结构的声明,任何工厂类都必须实现这个接口。
  2. 具体工厂( Concrete Creator)角色 具体工厂类是抽象工厂的一个实现,负责实例化某个产品族中的产品对象。
  3. 抽象(Product)角色 抽象模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
  4. 具体产品(ConcreteProduct)角色 抽象模式所创建的具体实例对象

产品组和产品等级结构

工厂模式:要么生产香蕉,要么生产苹果、要么生产西红柿;但是不能同时生产一 个产品组。抽象工厂:能同时生产一个产品族
而抽象工厂模式就可以生产一个产品族
在这里插入图片描述

产品等级结构:

生产香蕉。苹果。梨子。但是每种水果都有不同的等级,有的好吃,有的难吃。

产品族

南方香蕉/苹果/梨子(这是一个产品组)
北方香蕉/苹果/梨子 (这是另外一个产品族)

抽象工厂模式的实现

#include<iostream>
using namespace std;//抽象苹果
class AbstractApple{
public:virtual void ShowName() = 0;
};//中国苹果
class ChinaApple :public AbstractApple{
public:virtual void ShowName(){cout << "中国苹果" << endl;}
};class USAApple :public AbstractApple{
public:virtual void ShowName(){cout << "美国苹果" << endl;}
};
class JapanApple :public AbstractApple{
public:virtual void ShowName(){cout << "日本苹果" << endl;}
};
//抽象香蕉
class AbsrtactBanana{
public:virtual void ShowName() = 0;
};//中国香蕉
class ChinaBanana :public AbsrtactBanana{
public:virtual void ShowName(){cout << "中国香蕉" << endl;}
};
class USABanana :public AbsrtactBanana{
public:virtual void ShowName(){cout << "美国香蕉" << endl;}
};
class JapanBanana :public AbsrtactBanana{
public:virtual void ShowName(){cout << "日本香蕉" << endl;}
};//抽象的梨子
class AbsrtactPear{
public:virtual void ShowName() = 0;
};//中国梨子
class ChinaPear :public AbsrtactPear{
public:virtual void ShowName(){cout << "中国梨子" << endl;}
};
//美国梨子
class USAPear :public AbsrtactPear{
public:virtual void ShowName(){cout << "美国梨子" << endl;}
};
//日本梨子
class JapanPear :public AbsrtactPear{
public:virtual void ShowName(){cout << "日本梨子" << endl;}
};//抽象工厂   针对产品族
class AbstractFactoty{
public:virtual AbstractApple *CreateApple() = 0;virtual AbsrtactBanana *CreateBanana() = 0;virtual AbsrtactPear* CreatePear() = 0;
};//中国工厂
class ChinaFactory :public AbstractFactoty{
public:virtual AbstractApple *CreateApple(){return new ChinaApple;}virtual AbsrtactBanana *CreateBanana(){return new ChinaBanana;}virtual AbsrtactPear* CreatePear() {return new ChinaPear;}
};
//美国工厂
class USAFactory :public AbstractFactoty{
public:virtual AbstractApple *CreateApple(){return new USAApple;}virtual AbsrtactBanana *CreateBanana(){return new USABanana;}virtual AbsrtactPear* CreatePear() {return new USAPear;}
};
//日本工厂
class JapanFactory :public AbstractFactoty{
public:virtual AbstractApple *CreateApple(){return new JapanApple;}virtual AbsrtactBanana *CreateBanana(){return new JapanBanana;}virtual AbsrtactPear* CreatePear() {return new JapanPear;}
};void test01(){AbstractFactoty *factory = NULL;AbstractApple *apple = NULL;AbsrtactBanana *banana = NULL;AbsrtactPear *pear = NULL;//中国工厂factory = new ChinaFactory; apple = factory->CreateApple();banana = factory->CreateBanana();pear = factory->CreatePear();apple->ShowName();banana->ShowName();pear->ShowName();delete apple;delete banana;delete pear;
}int main(void){test01();system("pause");return 0;
}

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

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

相关文章

Win32项目关于MessageBox参数的详细说明

函数功能&#xff1a;该函数创建、显示、和操作一个消息框。消息框含有应用程序定义的消息和标题&#xff0c;加上预定义图标与Push&#xff08;下按&#xff09;按钮的任何组合。 函数原型&#xff1a;int MessageBox(HWND hWnd,LPCTSTR IpCaption,UINT…

w3af解析

1. w3af简介 w3afis a Web Application Attack and Audit Framework.即Web应用攻击和审计框架。w3af用python编写&#xff0c;依赖的库主要有2类&#xff0c;分别如下&#xff1a; <1> Core requirements: Python 2.6 fpconst-0.7.2&#xff1a;用于处理IEEE 754浮点…

1.c++中初始化列表和构造函数初始化的区别是什么?2.类的成员变量的初始化顺序是按照声明顺序吗?

初始化列表和构造函数初始化的区别是什么&#xff1f; 初始化和赋值对内置类型的成员没有太大的区别&#xff0c;在成员初始化列表和构造函数体内进行&#xff0c;在性能和结果上都是一样的。只有一些需要注意的事项 初始化列表一般情况如下&#xff1a; Date(int year, int …

设计模式---5(建造者模式的概念及其实现,建造者模式的角色与职责,建造者模式和工厂模式的区别)

建造者模式 建造者模式的概念 Builder 模式也叫建造者模式或者生成器模式&#xff0c;是由 GoF 提出的 23 种设计模式中的一种。 Builder 模式是一种对象创建型模式之一&#xff0c;用来隐藏复合对象的创建过程&#xff0c;它把复合对象的 创建过程加以抽象&#xff0c;通过子…

system阻塞SIGCHLD信号原因

system阻塞SIGCHLD信号原因 标签&#xff1a; c 2014-11-08 11:58 198人阅读 评论(0) 收藏 举报 分类&#xff1a; linux编程&#xff08;1&#xff09; 代码1&#xff1a;APUE10.18节的system函数源代码 int system(const char *cmdstring) /* with appropriate signal ha…

设计模式6---(单例模式的概念及其实现(懒汉式和饿汉式),线程安全)

单例模式 单例模式的概念 单例模式是一种对象创建型模式&#xff0c;使用单例模式&#xff0c;可以保证为一个类只生成唯一的实例对象。也就是说&#xff0c;在整个程序空间中&#xff0c;该类只存在一个实例对象。 GoF 对单例模式的定义是&#xff1a;保证一个类、只有一个实…

C语言解析http请求表单内容

[1].[文件] cgi.h ~ 405B 下载(105) 跳至 [1] [2] [3] [4] [5] [6] [7] [8] ?123456789101112131415161718192021222324252627#ifndef CGI_H#define CGI_H#include <stdio.h>#include <string.h>#include <stdlib.h>typedef struct Node{char *…

centos给用户添加sudo权限

linux给用户添加sudo权限&#xff1a; 有时候&#xff0c;linux下面运行sudo命令&#xff0c;会提示类似&#xff1a; xxxis not in the sudoers file. This incident will be reported. 这里&#xff0c;xxx是用户名称&#xff0c;然后导致无法执行sudo命令&#xff0c;这时候…

php手册

http://www.php100.com/manual/php/ http://www.kuqin.com/php5_doc/

套接字编程---2(TCP套接字编程的流程,TCP套接字编程中的接口函数,TCP套接字的实现,TCP套接字出现的问题,TCP套接字多进程版本,TCP套接字多线程版本)

TCP模型创建流程图 TCP套接字编程中的接口 socket 函数 #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> int socket(int domain, int type, int protocol); domain: AF_INET 这是大多数用来产生socket的协议&#xff0c;使用TCP或UDP来传输&…

安全关注

http://yttitan.blog.51cto.com/70821/1576365

Linux中netstat工具详解

简介 Netstat 命令用于显示各种网络相关信息&#xff0c;如网络连接&#xff0c;路由表&#xff0c;接口状态 (Interface Statistics)&#xff0c;masquerade 连接&#xff0c;多播成员 (Multicast Memberships) 等等。 常见参数 -a (all)显示所有选项&#xff0c;默认不显示…

网络基础 2-1(应用层,HTTP三点注意,HTTP协议格式, 最简单的HTTP服务器)

应用层 应用层 负责应用程序之间的数据沟通-----协议都是用户自己定的 自定制协议&#xff1a; 结构化数据传输 序列化&#xff1a; 将数据对象以指定的协议&#xff08;数据格式&#xff09;进行可用于持久化存储或者数据传输时的数据组织 例如在分布式的系统中&#xf…

正则表达式 学习

http://regexr.com/ 在线匹配 http://c.biancheng.net/cpp/html/1434.html 查询网址

网络基础2-2(传输层,端口,详谈UDP)

传输层 负责数据能够从发送端传输接收端. 端口号 端口号(Port)标识了一个主机上进行通信的不同的应用程序;在TCP/IP协议中, 用 “源IP”, “源端口号”, “目的IP”, “目的端口号”, “协议号” 这样一个五元组来标识一个通信(可以通过 netstat -n查看);一个端口只能被一个…

中文rfc文档路径

http://man.chinaunix.net/develop/rfc/default.htm

网络基础2-3(TCP协议,三次握手,四次挥手,TIME_WAIT状态的作用,TCP如何保证可靠传输,TCP连接中状态转化,滑动窗口,流量控制,快速重传,拥塞窗口,延迟应答,捎带应答,粘包问题)

TCP协议 TCP协议概念 TCP全称为 “传输控制协议(Transmission Control Protocol”). 人如其名, 要对数据的传输进行一个详细的控制 TCP协议格式 1. 源/目的端口号: 表示数据是从哪个进程来, 到哪个进程去; 2. 32位序号/32位确认号: 后面详细讲; 3. 4位TCP报头长度: 表示该…

超时设置

//read操作加上超时时间。1 int read_timeout(int fd, void *buf, uint32_t count, int time)2 {3 if(time > 0) {4 fd_set rSet;5 FD_ZERO(&rSet);6 FD_SET(fd, &rSet);7 8 struct timeval timeout;9 memset(&tim…

字符串题目 1 --------判断两个字符串是否为旋转词

题目描述 如果一个字符串为str&#xff0c;把字符串的前面任意部分挪到后面形成的字符串交str的旋转词。比如str“12345”&#xff0c;str的旋转串有“12345”、“45123”等等。给定两个字符串&#xff0c;判断是否为旋转词。 输入描述: 输出包含三行&#xff0c;第一个两个…

2021-03-04

为什么nginx转发后端默认使用1.0而不是1.1 在 Nginx 的官网文档中&#xff0c;有这样一个指令&#xff1a; Syntax: gzip_http_version 1.0 | 1.1; Default: gzip_http_version 1.1; Context: http, server, location Sets the minimum HTTP version of a request required to…