一、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. 设计模式之第1章-工厂方法模式(Java实现)

    设计模式之第1章-工厂方法模式(Java实现) “我先来”,“不,老公,我先!”.远远的就听到几个人,哦不,是工厂方法模式和抽象工厂模式俩小夫妻在争吵,尼妹,又不是吃东西,谁先来不都一样(吃货的世界~ ...

  2. JAVA设计模式——第 5 章 工厂方法模式【Factory Method Pattern】(转)

    女娲补天的故事大家都听说过吧,今天不说这个,说女娲创造人的故事,可不是“造人”的工作,这个词被现代人滥用了.这个故事是说,女娲在补了天后,下到凡间一看,哇塞,风景太优美了,天空是湛蓝的,水是清澈的,空 ...

  3. 设计模式C#实现(九)——工厂方法模式和简单工厂

    工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类.Factory Method使一个类的实例化延迟到其子类. 构成: 1.Product工厂方法创建的对象的接口 2.Concrete ...

  4. 第 5 章 工厂方法模式【Factory Method Pattern】

    以下内容出自:<<24种设计模式介绍与6大设计原则>> 女娲补天的故事大家都听说过吧,今天不说这个,说女娲创造人的故事,可不是“造人”的工作,这个词被现代人滥用了.这个故事是说 ...

  5. Java设计模式从精通到入门四 工厂方法模式

    工厂方法模式 属于23中设计模式中创建型类型. 核心思想:工厂提供创建对象的接口,由子类决定实例化哪一个子类. 来源 ​ 设计模式之禅中的例子,女娲造人,通过八卦炉来进行造人,没有烧熟的为白人,烧太熟 ...

  6. 大话设计模式C++实现-第15章-抽象工厂模式

    一.UML图 二.概念 抽象方法模式(Abstract Factory):提供一个创建一系列相关或互相依赖对象的接口,而无需指定他们详细的类. 三.包括的角色 (1)抽象工厂 (2)详细工厂:包含详细 ...

  7. 大话设计模式C++版——工厂方法模式

    工厂方法模式是以简单工厂模式为基础的,如果未了解简单工厂模式的同学可先浏览<大话设计模式C++版——简单工厂模式>.在简单工厂模式中,提到过简单工厂模式的缺陷,即违背了开发—封闭原则,其主 ...

  8. 大话设计模式Python实现-工厂方法模式

    工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延时到其子类. #!/usr/bin/env python ...

  9. [Python设计模式] 第8章 学习雷锋好榜样——工厂方法模式

    github地址:https://github.com/cheesezh/python_design_patterns 简单工厂模式 v.s. 工厂方法模式 以简单计算器为例,对比一下简单工厂模式和工 ...

随机推荐

  1. R in action读书笔记(9)-第八章:回归 -回归诊断

    8.3回归诊断 > fit<-lm(weight~height,data=women) > par(mfrow=c(2,2)) > plot(fit) 为理解这些图形,我们来回 ...

  2. 使用Jenkins进行android项目的自动构建(1)

    环境搭建 1. 下载JDK,安装,并将JDK的安装目录加入到环境变量JAVA_HOME,将JDK的bin目录加入到环境变量PATH. 2. 下载Android SDK,解压,并将SDK的安装目录加入到 ...

  3. OC语言Block 续

    OC语言 Block 转载:http://blog.csdn.net/weidfyr/article/details/48138167 1.Block对象中的变量行为 结论: 在block代码块内部可 ...

  4. Mac下Eclipse/adb无法调试MX5手机

    前提是环境已经配置好,其他手机可以连接但MX系列不可以 解决方法:打开终端 echo 0x2a45 >> ~/.android/adb_usb.ini adb kill-server ad ...

  5. https://quotefancy.com/ 经典句子(英语) 真是特别好~

    https://quotefancy.com/ 经典句子(英语)

  6. thisInObject

    var k = { name:"kName" ,getName:function(){ console.info(this.name) } ,getParentName:funct ...

  7. 循环实现数组 map 方法

    //循环实现数组 map 方法 const selfMap = function (fn, context) { let arr = Array.prototype.slice.call(this) ...

  8. ActiveX控件获取不到对象属性或者方法的原因分析

    1.找不到调用的DLL或程序: 2.调用控件方法名称,与定义的函数名称不符合: 3.如果是网站网页调用ActiveX,检查控件是否添加安全对象: 4.如果是网站网页调用ActiveX,检查网页是否加入 ...

  9. webservice和一般处理程序

    一丶WebService 1.新建项目 2.选择Web窗体 3.添加新建项 二丶一般处理程序 前台访问: $.ajax({ type: "post", url: "Han ...

  10. 2.10.2 section元素

    section元素 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> & ...