简单工厂模式
时间:2022-04-26
本文章向大家介绍简单工厂模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一、简单工厂模式的相关概念:
1、定义:简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式。
其核心思想就是有一个专门的工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。
2、举例:如卖水果,每种水果有不一样的价钱,那么就可以将水果作为抽象产品,而苹果,香蕉等作为具体产品
3、UML图如下:
每个类的主要功能:
简单工厂:简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。
抽象产品:简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
具体产品:是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。
二、C++程序示例
1 // 简单工厂模式.cpp : 定义控制台应用程序的入口点。
2 //
3
4 #include "stdafx.h"
5 #include <iostream>
6 #include<string>
7 using namespace std;
8
9 //抽象产品
10 class fruit
11 {
12 public:
13 fruit();
14 virtual ~fruit();
15 //由于此类是抽象类,没有价格,所以只能将价格显示定义为纯虚函数
16 virtual void show_price()=0;
17 };
18 fruit::fruit()
19 {}
20 fruit::~fruit()
21 {}
22
23 //具体产品1
24 class apple :public fruit
25 {
26 public :
27 apple();
28 virtual ~apple();
29 virtual void show_price();
30 };
31 apple::apple()
32 {
33 cout<<"i am an apple"<<endl;
34 }
35 apple::~apple()
36 {}
37 void apple::show_price()
38 {
39 cout<<"my price is 5"<<endl;
40 }
41
42 //具体产品2
43 class orange :public fruit
44 {
45 public :
46 orange();
47 virtual ~orange();
48 virtual void show_price();
49 };
50 orange::orange()
51 {
52 cout<<"i am an orange"<<endl;
53 }
54 orange::~orange()
55 {}
56 void orange::show_price()
57 {
58 cout<<"my price is 6"<<endl;
59 }
60 //简单工厂
61 //输入要创建实例的编号,创建对应实例,1:apple,2:orange
62 class fruit_samplefactory
63 {
64 public:
65 fruit_samplefactory();
66 ~fruit_samplefactory();
67 public:
68 //此处一定要声明为静态成员函数,因为非静态成员,必须首先实例化一个类对象,才能使用
69 static fruit* creat_fruit(int name_num);
70 //fruit* creat_fruit(int name_num);
71 };
72 fruit_samplefactory::fruit_samplefactory()
73 {
74
75 }
76 fruit_samplefactory::~fruit_samplefactory()
77 {
78
79 }
80 fruit* fruit_samplefactory::creat_fruit(int name_num)
81 {
82 switch(name_num)
83 {
84 case 1:
85 return new apple;
86 break;
87 case 2:
88 return new orange;
89 break;
90 default:
91 cout<<"您输入的类型不存在"<<endl;
92 return NULL;
93 break;
94 }
95 }
96
97 //用户界面
98 int _tmain(int argc, _TCHAR* argv[])
99 {
100 int num=2;
101 fruit* orange=NULL;
102 orange=fruit_samplefactory::creat_fruit(num);
103 orange->show_price();
104 delete orange;
105 orange=NULL;
106 return 0;
107 }
注意问题:1、第16行show_price(),由于fruit是抽象产品,没有价格,所以此处一定要用纯虚函数 虚函数是一定要在类中声明并定义的,而纯虚函数可以在类中声明而不定义,而在子类中进行定义
2、由于第102行调用creat_fruit(num);的时候并没有将orange实例化为fruit_samplefactory类,而因为非静态成员,必须首先实例化一个类对象,才能使用。
所以要将69行中creat_fruit(num);声明为静态成员函数static fruit* creat_fruit(int name_num);估计这就是简单工厂模式又叫做静态工厂模型的原因吧。
- 如何使用HTTP压缩优化服务器
- "org.jboss.netty.internal.LoggerConfigurator".DESCRIBED is already registered 的解决办法
- ASP.NET SignalR 高可用设计
- JavaScript 和asp.net配合编码字符串
- 3D游戏开发之UE4中的集合:TSet容器
- weblogic启动失败:Could not obtain the localhost address 解决办法
- 如何理解云计算?很简单,就像吃货想吃披萨了……
- .NET 2.0 中使用Active Directory 应用程序模式 (ADAM)
- struts2: 通过流输出实现exce导出
- Google的数据交换协议:GData (Google Data APIs Protocol)
- C# 内部类
- 四字母.com域名均以五位数结拍
- mybatis 3.2.7 与 spring mvc 3.x、logback整合
- spring 3.2.x + struts2 + mybatis 3.x + logback 整合配置
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 深入 TypeScript 中的子类型,进阶 Vue3 源码前必须搞懂的。
- 第三方模块
- package.json文件的作用
- C语言的原子操作
- 【Linux】tmux命令使用教程
- 【Android 音视频开发打怪升级:FFmpeg音视频编解码篇】七、Android FFmpeg 视频编码
- 2020已经过去五分之四了,你确定还不来了解一下JS的rAF?
- c#任意进制转换
- 缺失值的处理方法(基于sklearn)
- 中国核酸数据库GSA数据提交指南
- 基于sklearn建立机器学习的pipeline
- Sentinle集群流控【源码笔记】
- ggplot坐标轴方向设置
- Scaling与Normalization的区别
- Android 音乐APP(一)扫描本地音乐