大话设计模式C++实现-第8章-工厂方法模式
一、UML图
二、概念
工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法是一个类的实例化延迟到其子类。
三、包括的角色
(1)抽象工厂
(2)详细工厂
(3)抽象产品
(4)详细产品
四、优势
(1)工厂方法模式是对简单工厂模式的略微的改进。工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际工作推迟到子类中。
(2)与简单工厂模式相比,制造产品的工厂类不再 仅仅有一个。而是每种详细产品类都相应一个生产它的详细工厂类。
而这些详细工厂类的共同特征再被提取出来形成一个抽象产品类,这些详细产品类都继承自这个抽象产品类。
(3)当须要添加一种产品的时候,须要做的是:添加一种继承自抽象产品的详细产品类。添加一种继承在抽象工厂的详细工厂类。更改client。而不须要在简单工厂模式中那样更改工厂内的switch。
五、C++实现
(1)计算器的样例
#include <iostream>
#include <cstdlib> using namespace std; //抽象产品类
class Operation
{
protected:
double numberA;
double numberB; public:
double getA()
{
return numberA;
}
double getB()
{
return numberB;
}
void setA(double number)
{
numberA=number;
}
void setB(double number)
{
numberB=number;
} virtual double GetResult()
{
double result=0;
return result;
}
};
//以下是四个详细产品类
class OperationAdd:public Operation
{
public:
double GetResult()
{
double result=0;
result=numberA+numberB;
return result;
}
}; class OperationSub:public Operation
{
public:
double GetResult()
{
double result=0;
result=numberA-numberB;
return result;
}
}; class OperationMul:public Operation
{
public:
double GetResult()
{
double result=0;
result=numberA*numberB;
return result;
}
}; class OperationDiv:public Operation
{
public:
double GetResult()
{
double result=0;
if(numberB!=0)
result=numberA/numberB;
return result;
}
}; //抽象工厂类
class AbstractFactory
{
public:
virtual Operation* createOperation()
{
return new Operation;
}
};
//以下是四个详细工厂类。分别用于产生四个详细产品
class AddFactory:public AbstractFactory
{
public:
Operation* createOperation()
{
Operation* oper=new OperationAdd;
return oper;
}
}; class SubFactory:public AbstractFactory
{
public:
Operation* createOperation()
{
Operation* oper=new OperationSub;
return oper;
}
}; class MulFactory:public AbstractFactory
{
public:
Operation* createOperation()
{
Operation* oper=new OperationMul;
return oper;
}
}; class DivFactory:public AbstractFactory
{
public:
Operation* createOperation()
{
Operation* oper=new OperationDiv;
return oper;
}
}; //client
void main()
{
AbstractFactory* af=NULL;
af=new AddFactory(); Operation* oper=NULL;
oper=af->createOperation(); oper->setA(1);
oper->setB(2);
cout<<oper->GetResult()<<endl; if(af!=NULL)
{
delete af;
af=NULL;
}
if(oper!=NULL)
{
delete oper;
oper=NULL;
} system("pause");
}
(2)雷锋工厂的样例
#include <iostream>
#include <cstdlib> using namespace std; //抽象产品类:雷锋
class Leifeng
{
public:
virtual void Sweep()
{
cout<<"扫地"<<endl;
}
virtual void Wash()
{
cout<<"洗衣"<<endl;
}
virtual void BuyRice()
{
cout<<"买米"<<endl;
}
}; //以下是两个详细产品类
class Undergraduate:public Leifeng
{
public:
void Sweep()
{
cout<<"学生-扫地"<<endl;
}
void Wash()
{
cout<<"学生-洗衣"<<endl;
}
void BuyRice()
{
cout<<"学生-买米"<<endl;
}
}; class Volunteer:public Leifeng
{
public:
void Sweep()
{
cout<<"志愿者-扫地"<<endl;
}
void Wash()
{
cout<<"志愿者-洗衣"<<endl;
}
void BuyRice()
{
cout<<"志愿者-买米"<<endl;
}
}; //抽象工厂类
class AbstractFactory
{
public:
virtual Leifeng* CreateLeifeng()
{
return new Leifeng;
}
}; //以下是两个详细工厂类,分别于两个详细产品相相应
class UndergraduateFactory:public AbstractFactory
{
public:
Undergraduate* CreateLeifeng()
{
return new Undergraduate;
}
}; class VolunteerFactory:public AbstractFactory
{
public:
Volunteer* CreateLeifeng()
{
return new Volunteer();
}
}; //client
void main()
{
//想要生产Volunteer产品的话,仅仅须要将此处的UndergraduateFactory更改为VolunteerFactory就可以。
AbstractFactory* af=NULL;
af=new VolunteerFactory; Leifeng* lf=NULL;
lf=af->CreateLeifeng(); lf->BuyRice();
lf->Sweep();
lf->Wash(); if(af!=NULL)
{
delete af;
af=NULL;
}
if(lf!=NULL)
{
delete lf;
lf=NULL;
} system("pause");
}
(3)执行截图
大话设计模式C++实现-第8章-工厂方法模式的更多相关文章
- 设计模式之第1章-工厂方法模式(Java实现)
设计模式之第1章-工厂方法模式(Java实现) “我先来”,“不,老公,我先!”.远远的就听到几个人,哦不,是工厂方法模式和抽象工厂模式俩小夫妻在争吵,尼妹,又不是吃东西,谁先来不都一样(吃货的世界~ ...
- JAVA设计模式——第 5 章 工厂方法模式【Factory Method Pattern】(转)
女娲补天的故事大家都听说过吧,今天不说这个,说女娲创造人的故事,可不是“造人”的工作,这个词被现代人滥用了.这个故事是说,女娲在补了天后,下到凡间一看,哇塞,风景太优美了,天空是湛蓝的,水是清澈的,空 ...
- 设计模式C#实现(九)——工厂方法模式和简单工厂
工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类.Factory Method使一个类的实例化延迟到其子类. 构成: 1.Product工厂方法创建的对象的接口 2.Concrete ...
- 第 5 章 工厂方法模式【Factory Method Pattern】
以下内容出自:<<24种设计模式介绍与6大设计原则>> 女娲补天的故事大家都听说过吧,今天不说这个,说女娲创造人的故事,可不是“造人”的工作,这个词被现代人滥用了.这个故事是说 ...
- Java设计模式从精通到入门四 工厂方法模式
工厂方法模式 属于23中设计模式中创建型类型. 核心思想:工厂提供创建对象的接口,由子类决定实例化哪一个子类. 来源 设计模式之禅中的例子,女娲造人,通过八卦炉来进行造人,没有烧熟的为白人,烧太熟 ...
- 大话设计模式C++实现-第15章-抽象工厂模式
一.UML图 二.概念 抽象方法模式(Abstract Factory):提供一个创建一系列相关或互相依赖对象的接口,而无需指定他们详细的类. 三.包括的角色 (1)抽象工厂 (2)详细工厂:包含详细 ...
- 大话设计模式C++版——工厂方法模式
工厂方法模式是以简单工厂模式为基础的,如果未了解简单工厂模式的同学可先浏览<大话设计模式C++版——简单工厂模式>.在简单工厂模式中,提到过简单工厂模式的缺陷,即违背了开发—封闭原则,其主 ...
- 大话设计模式Python实现-工厂方法模式
工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延时到其子类. #!/usr/bin/env python ...
- [Python设计模式] 第8章 学习雷锋好榜样——工厂方法模式
github地址:https://github.com/cheesezh/python_design_patterns 简单工厂模式 v.s. 工厂方法模式 以简单计算器为例,对比一下简单工厂模式和工 ...
随机推荐
- R in action读书笔记(14)第十一章 中级绘图 之一:散点图(高能预警)
第十一章中级绘图 本章内容: 二元变量和多元变量关系的可视化 绘制散点图和折线图 理解相关图 学习马赛克图和关联图 本章用到的函数有: plot hexbin ablines iplot scatte ...
- Python学习 Day 1-简介 安装 Hello world
简介 Python(英语发音:/ˈpaɪθən/), 是一种面向对象.解释型计算机程序设计语言,由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年,Python 源 ...
- win7 快捷键 收集
1. 轻松访问键盘快捷方式 按住右 Shift 八秒钟:启用和关闭筛选键 按左 Alt + 左 Shift + PrtScn (或 PrtScn):启用或关闭高对比度 按左 Alt + 左 Shift ...
- 开源一个一个NodeJS 代理服务器扫描工具,可以用来***
鉴于我朝很多网站访问不了,google等就是大悲剧,之前一直在用VPN,但是公司内网VPN被封,诸多工具也惨遭毒手..我辈怎能容忍. 目前只有代理没有被封,于是搞了个代理扫描工具并开源: https: ...
- C#通过post发送接收数据流
发送数据流方法 /// <summary> /// /// </summary> /// <param name="url">目标url< ...
- CAD参数绘制多段线(com接口)
多段线又被称为多义线,表示一起画的都是连在一起的一个复合对象,可以是直线也可以是圆弧并且它们还可以加不同的宽度. 主要用到函数说明: _DMxDrawX::PathLineTo 把路径下一个点移到指定 ...
- shell 循环 read line
cat dockerlist |while read line;do docker rmi $line ;done
- 第2节 hive基本操作:9、hive当中创建外部表的语法及外部表的操作&分区表的语法和操作
外部表: 外部表说明: 外部表因为是指定其他的hdfs路径的数据加载到表当中来,所以hive表会认为自己不完全独占这份数据,所以删除hive表的时候,数据仍然存放在hdfs当中,不会删掉 管理表和外部 ...
- NET SignaiR 实现消息的推送,并使用Push.js实现通知
一.使用背景 1. SignalR是什么? ASP.NET SignalR 是为 ASP.NET 开发人员提供的一个库,可以简化开发人员将实时 Web 功能添加到应用程序的过程.实时 Web 功能是指 ...
- python 列表生成式、lower()和upper()的使用
参考: http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0013868196389 ...