《大话设计模式》c++实现 之工厂模式
工厂模式
工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
介绍
意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
主要解决:主要解决接口选择的问题。
何时使用:我们明确地计划不同条件下创建不同实例时。
如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品。
关键代码:创建过程在其子类执行。
应用实例: 1、您需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。 2、Hibernate 换数据库只需换方言和驱动就可以。
优点: 1、一个调用者想创建一个对象,只要知道其名称就可以了。 2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。 3、屏蔽产品的具体实现,调用者只关心产品的接口。
缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。
使用场景: 1、日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。 2、数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。 3、设计一个连接服务器的框架,需要三个协议,"POP3"、"IMAP"、"HTTP",可以把这三个作为产品类,共同实现一个接口。
注意事项:作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。
#include <iostream>
using namespace std; // 抽象产品类
class Operation{
protected:
double num1;
double num2;
public:
double get_n1(){
return num1;
}
double get_n2(){
return num2;
}
void set_n1(int num){
num1 = num;
}
void set_n2(int num){
num2 = num;
}
virtual double GetResult(){
double result = ;
return result;
} };
//具体产品类
class OperationAdd:public Operation{
public:
double GetResult(){
double result = ;
result = num1 + num2;
return result;
}
}; //具体产品类
class OperationSub :public Operation{
public:
double GetResult(){
double result = ;
result = num1 - num2;
return result;
}
}; //具体产品类
class OperationMul :public Operation{
public:
double GetResult(){
double result = ;
result = num1 * num2;
return result;
}
}; //具体产品类
class OperationDiv :public Operation{
public:
double GetResult(){
double result = ;
if (num2!=)
result = num1 / num2;
return result;
}
};
//工厂类 class OperationFactory{
public:
Operation* createOperation(char type){
Operation* oper=NULL;
switch (type)
{
case '+':
oper = new OperationAdd;
break;
case '-':
oper = new OperationSub;
break;
case '*':
oper = new OperationMul;
break;
case '/':
oper = new OperationDiv;
break;
}
return oper;
}
}; void main(){ Operation* oper = NULL;
OperationFactory of;
oper = of.createOperation('+');
oper->set_n1();
oper->set_n2();
double res = oper->GetResult();
cout << res << endl;
if (oper != NULL)
{
delete oper;
oper = NULL;
} system("pause");
}
参考:http://www.runoob.com/design-pattern/factory-pattern.html
https://blog.csdn.net/xiqingnian/article/details/40949749
《大话设计模式》c++实现 之工厂模式的更多相关文章
- 大话设计模式C++版——抽象工厂模式
		
前面说过,简单工厂模式是最基础的一种设计模式,那以工厂命名的设计模式就是23种设计模式中最多的一种,他们一脉相承,一步一步进化而来,这里就是其中的最后一种——抽象工厂模式(Abstract Facto ...
 - 大话设计模式C++版——简单工厂模式
		
简单工厂模式应该是所有设计模式中最简单,也最基础的一种模式,以下是一个简单的采用工厂模式写一个加减法的计算器. 1.抽象接口类——依赖倒转原则(高层和底层都要依赖于抽象,针对接口编程) class I ...
 - 大话设计模式Python实现- 抽象工厂模式
		
抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的类 下面是一个抽象工厂的demo: #!/usr/bin/env pyth ...
 - 《大话设计模式》c++实现 工厂模式
		
工厂模式 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在工厂模式中,我们在创建对象时不会对客户端 ...
 - <五>读《《大话设计模式》》之工厂模式
		
怎么又是工厂模式呢?上次不是讲过简单工厂模式吗?不错.此工厂模式非彼工厂模式. 工厂模式:定义一个用于创建对象的接口.让子类决定实例化那一个类,工厂方法是一个类的实例化延迟到其子类. 还是以代码来进行 ...
 - 大话设计模式Python实现-简单工厂模式
		
简单工厂模式(Simple Factory Pattern):是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类. 下面使用简单工厂模式实现一个简单的四则运算 #!/usr/ ...
 - headfirst设计模式(5)—工厂模式体系分析及抽象工厂模式
		
先编一个这么久不写的理由 上周我终于鼓起勇气翻开了headfirst设计模式这本书,看看自己下一个设计模式要写个啥,然后,我终于知道我为啥这么久都没写设计模式了,headfirst的这个抽象工厂模式, ...
 - java设计模式-----1、简单工厂模式
		
简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例,简单来说 ...
 - Java设计模式(1)工厂模式(Factory模式)
		
工厂模式定义:提供创建对象的接口. 为何使用工厂模式 工厂模式是我们最常用的模式了,著名的Jive论坛,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见. 为什么工厂模式是如此常用?因 ...
 - 设计模式之单例模式与工厂模式的Python实现(二)
		
2. 工厂模式 工厂模式是创建型设计模式的一种.核心的思想是,通过传递给类或函数某种产品的信息来创建产品并返回.当我们想得到产品a对象,只需把产品a的名字传递给工厂函数就能得到产品a对象.而核心思想的 ...
 
随机推荐
- LeetCode 104 Maximum Depth of Binary Tree 解题报告
			
题目要求 Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the ...
 - 2018/04/14 理解oAuth2.0
			
最近都近没有更新博客了,卡在 oAuth 上了. 之前公司做统一身份的认证,不了解 oAuth 的我在这卡了两天. 于是决定仔细研究原理,理论指导实践. -- 什么是 oAuth ? 简单来说 oAu ...
 - python_flask 注册,登陆,退出思路 ---纯个人观点
			
1注册逻辑首先查询数据库用户名 并判断用户是否存在,如不存在就插入数据 并返回响应给前端2前端模板获取注册信息 判断 用户名不能为空及密码不能为空,和密码不一致 拼接注册url 组成get获取对象 响 ...
 - tensorflow入门笔记(四) tf.summary 模块
			
模块内的函数: tf.summary.audio(name, tensor, sample_rate, max_outputs=3, collections=None, family=None) 输出 ...
 - RSA 理论
			
一.同余 给定一个正整数m,如果两个整数a和b满足(a-b)能够被m整除,即(a-b)/m得到一个整数,那么就称整数a与b对模m同余,记作a≡b(mod m) 二.欧拉定理 任意给定正整数n,请问在小 ...
 - Ubuntu上Xilinx ARM交叉编译器安装
			
1,Windows中下载交叉编译器 2,在ubuntu中创建zedboard目录,并将交叉编译器复制进来 3,将该交叉编译器设置成可执行程序 chmod a+x xilinx-2011.09-50 ...
 - cd 命令
			
[root@localhost ~]# cd # 进入当前用户的家目录 [root@localhost ~]# cd ~ # 进入当前用户的家目录 [root@localhost ~]# cd /da ...
 - linux md5sum命令
			
md5sum命令用于生成和校验文件的md5值 生成文件md5值 [root@cdncenter ~]# ll total -rw-r--r-- root root Oct : .txt -rw-r-- ...
 - vue监听滚动事件 实现某元素吸顶或者固定位置显示
			
https://blog.csdn.net/wang1006008051/article/details/78003974 1.监听滚动事件 利用VUE写一个在控制台打印当前的scrollTop, 首 ...
 - Centos7安装jdk1.8并查找jdk安装目录
			
安装之前先检查一下系统有没有自带open-jdk rpm -qa |grep java rpm -qa |grep jdk rpm -qa |grep gcj 如果没有输入信息表示没有安装. 如果安装 ...