一、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. markdown表格中怎么插入逻辑或符号|?

    | 73向下投票接受 | 如果你删除反引号(****),使用|`黑客作品 a | r ------------|----- `a += x;` | r1 a |= y; | r2 并产生以下输出 在这 ...

  2. Farseer.net轻量级开源框架说明及链接索引

    Farseer.net是什么? 基于.net framework 4 开发的一系列解决方案. 完全开源在GitHub中托管.并发布到NuGet中. Farseer.Net由最初的关系数据库ORM框架后 ...

  3. Kotlin:数组、字符串模板

    一.数组 Kotlin 中的数组是带有类型参数的类,其元素类型被指定为相应的类型参数,使用 Array 类来表示, Array 类定义了 get 与 set 函数(按照运算符重载约定这会转变为 [ ] ...

  4. Java8新特性 Stream流式思想(一)

    遍历及过滤集合中的元素使用传统方式遍历及过滤集合中的元素package cn.com.zq.demo01.Stream.test01.Stream; import java.util.ArrayLis ...

  5. Log4j 配置某个类中某个方法的输出日志到指定文件

    我们在项目中使用log4j开发的时候,会遇到一些特殊的情况,比如:要输出某个类中某个方法的日志信息到文件中,方便以后查看 可以使用如下配置: log4j.rootLogger=info,stdout ...

  6. cut - 在文件的每一行中提取片断

    总览 (SYNOPSIS) ../src/cut [OPTION]... [FILE]... 描述 (DESCRIPTION) 在 每个文件 FILE 的 各行 中, 把 提取的 片断 显示在 标准输 ...

  7. 02Document Type Definition

    Document Type Definition 1. Document Type Definition DTD(Document Type Definition)文件格式定义作用是给予文件一种格(T ...

  8. 初始化react项目

    react脚手架 npm install -g create-react-app 国内npm一般下载比较慢或者是常出现下载失败的情况,我们可以指定下载的仓库: npm install -g creat ...

  9. oracle分析函数之ratio_to_report

    ratio_to_report主要完成对百分比的计算,语法为ratio_to_report(exp) over()也就是根据over窗口函数的作用区间,求出作用区间中的单个值在整个区间的总值的比重比如 ...

  10. HDU - 4514 湫湫系列故事——设计风景线(并查集判环)

    题目: 随着杭州西湖的知名度的进一步提升,园林规划专家湫湫希望设计出一条新的经典观光线路,根据老板马小腾的指示,新的风景线最好能建成环形,如果没有条件建成环形,那就建的越长越好. 现在已经勘探确定了n ...