模式定义:

工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。

工厂方法让类把实例化推迟到子类。

模式结构:

Creator是一个类,它实现了全部操纵产品的方法,但不实现工厂方法。

Creator的全部子类都必须实现工厂方法(factoryMethod()),以实际制造出产品。

全部的产品必须实现Product基类。这样一来使用这些产品的类就能够引用这个基类,而不是派生类。

举例:

披萨店希望可以开一些加盟店。

经营者希望确保加盟店运营的质量,所以希望这些店都使用能经过实践考研的代码。问题在于每家加盟店都可能想要提供不同风味的披萨(例如说纽约。芝加哥,加州)。这收到了开店地点及该地区披萨口味的影响。

解决的方法:让每一个区域风味的披萨工厂继承基类披萨工厂使披萨工厂的订单系统不变。然后创建自己风味的披萨。这样真正选购披萨类型,使用详细的披萨工厂决定的。

类图设计:

编程实现及运行结果:

#include <iostream>
#include <string>
#include <list>
using namespace std;

首先创建Pizza类

class Pizza
{
public:Pizza(string nam, string doug, string sauc){name = nam;dough = doug;sauce = sauc;}void addTops(string tops){toppings.push_back(tops);}void prepare(){cout << "Preparing " << name << endl;cout << "Tossing dough" << endl;cout << "Adding sauce" << endl;cout << "Adding toppings" << endl;list<string>::iterator iter = toppings.begin();for(; iter!=toppings.end(); ++iter){cout << "    "<< *iter;}cout << endl;}void bake(){cout << "Bake for 25 minutes at 350" << endl;}void cut(){cout << "Cutting the pizza into diagonal slices" << endl;}void box(){cout << "Place pizza in offical PizzaStore box" << endl;}string getName(){return name;}private:string name;string dough;string sauce;list<string> toppings;
};

然后创建纽约cheese风格的pizza类和纽约clam风格的pizza类

class NYStyleCheesePizza : public Pizza
{
public:NYStyleCheesePizza():Pizza("NY Style Sauce and Cheese Pizza", "Thin Crust Dough", "Marinara Sauce"){addTops("Grated Reggiano Cheese");}
};
class NYStyleClamPizza : public Pizza
{
public:NYStyleClamPizza():Pizza("NY Style Sauce and Clam Pizza", "Thin Crust Dough", "Marinara Sauce"){addTops("Grated Clam");}
};

创建基类工厂

class PizzaStore
{
public:virtual ~PizzaStore(){}Pizza* oderPizza(string type){Pizza* pizza = createPizza(type);pizza->prepare();pizza->bake();pizza->cut();pizza->box();return pizza;}virtual Pizza* createPizza(string type){return NULL;}};

创建详细类工厂(纽约pizza工厂)

class NYPizzaStore : public PizzaStore
{
public:Pizza* createPizza(string item){if(item == "cheese"){return new NYStyleCheesePizza();}else if(item == "clam"){return new NYStyleClamPizza();}else return NULL;}
};
//...创建其它地区工厂...

客户代码:

int main()
{PizzaStore* nyStore = new NYPizzaStore();Pizza* pizza = nyStore->oderPizza("cheese");cout << "Ethan ordered a "<< pizza->getName() << endl;return 0;
}

运行结果:

PreparingNY Style Sauce and Cheese Pizza

Tossingdough

Addingsauce

Addingtoppings

        Grated Reggiano Cheese

Bakefor 25 minutes at 350

Cuttingthe pizza into diagonal slices

Placepizza in offical PizzaStore box

Ethanordered a NY Style Sauce and Cheese Pizza

请按随意键继续. . .

设计原则的应用:

设计原则6:依赖倒置原则(Dependency Inversion Priciple):要依赖抽象,不要依赖详细类。

设计原则4:工厂方法用来处理对象的创建,并将这种行为封装在子类中。这样,客户中关于基类的代码和子类对象对象创建代码解耦了。

參考Head First设计模式

转载于:https://www.cnblogs.com/clnchanpin/p/6849179.html

设计模式C++实现——工厂方法模式相关推荐

  1. Java 设计模式之静态工厂方法模式

    设计模式系列 创建型设计模式 Java 设计模式之单例模式 Java 设计模式之静态工厂方法模式 Java 设计模式之工厂方法模式 Java 设计模式之抽象工厂模式 Java 设计模式之Builder ...

  2. 手撕设计模式之「工厂方法模式」(Java描述)

    前言 工厂方法模式是对简单工厂模式的改进,它通过对工厂类进行抽象形成一个抽象工厂接口,再让具体的工厂负责对应产品的创建,使得在增加产品的场景中也满足"开闭原则".希望通过本文的学习 ...

  3. 设计模式学习-工厂方法模式

    在上文(设计模式学习-简单工厂模式)的模拟场景中,我们用简单工厂模式实现了VISA和MASTERARD卡的刷卡处理,系统成功上线并运行良好,突然有一天老大跑来说,我们的系统需要升级,提供对一般银联卡的 ...

  4. 设计模式----创建型设计模式(单例模式、工厂方法模式、构建者模式)

    创建型设计模式 单例模式(Singleton Pattern) 单例模式介绍 代码演示 饿汉式(静态常量) 饿汉式(静态代码块) 懒汉式(线程不安全) 懒汉式(线程安全,同步方法) 懒汉式(线程安全, ...

  5. 【设计模式学习】工厂方法模式

    cpp学习设计模式:工厂方法模式 在学习工厂方法模式之前,先回忆前面学的简单工厂模式: 简单工厂模式就是将对象的创建和逻辑的判断都交给了一个工厂类去做,这样做的优点是客户端不需要知道具体产品类的类名和 ...

  6. 设计模式系列之 工厂方法模式

    定义 定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类.工厂方法让类的实例化推迟到子类中进行. 该定义是对生产者一方的描述,涉及四种角色,包括接口.接口实现类.被实例化的类.抽象产品(隐 ...

  7. 设计模式读书笔记-----工厂方法模式

    一.问题 在前一章<设计模式读书笔记-----简单工厂模式>中通过披萨的实例介绍了简单工厂模式.在披萨实例中,如果我想根据地域的不同生产出不同口味的披萨,如纽约口味披萨,芝加哥口味披萨.如 ...

  8. 设计模式之四:工厂方法模式(披萨店生产披萨模拟流程)

    工厂方法模式:定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个.工厂方法让类把实例化推迟到子类.(披萨店生产披萨模拟流程) 工厂方法模式通过让子类决定该创建的对象是什么,来达到将对象的过程封 ...

  9. 设计模式的艺术 工厂方法模式

    不懂使用为学过,说出用途,绘制结构为了解,不会灵活使用基本等于没学. 前言 工厂方法模式是简单工厂模式的延伸,它继承了简单工厂方法模式的优点,同时还弥补了简单工厂方法模式的不足, 工厂方法模式是使用频 ...

最新文章

  1. 详解Clojure的递归(下)——相互递归和trampoline
  2. python手机版安卓-手机随时随地写Python,还可以开发安卓APP,太厉害了!
  3. DL之DeepLabv3:DeepLab v3和DeepLab v3+算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
  4. 震惊!PMCAFF被成功转型!
  5. 存储过程 not supported yet_让我们来看看+Redis如何存储和计算一亿用户的活跃度
  6. xpath和css selector
  7. 微软Kubernetes服务AKS开发正式版空间服务
  8. ubuntu linux 启用root用户登录
  9. 2.2 The Environment Abstraction Layer (EAL)
  10. Atitit usbQb212 oo 面向对象封装的标准化与规范解决方案java c# php js
  11. 如何 设置CTEX WinEdt 改变默认的 PDF viewer
  12. H12-211数通HCNA题库解析(一)
  13. 对话系统 | (4) 任务型对话系统基础
  14. PC端答题小助手软件 – 用 OCR 高效完成在线答题
  15. 给定两个字符串 s 和 t,它们只包含小写字母。 字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。 请找出在 t 中被添加的字母
  16. Matlab_插值与抽取
  17. PhoneGapjQuery Mobile应用开发环境配置(For Android)
  18. 四川大学软件学院保研预推免面试面经
  19. python中的序列类型数据结构元素的切片操作_PythonI/O进阶学习笔记_4.自定义序列类(序列基类继承关系/可切片对象/推导式)...
  20. 数据事务及ACID特性、事务回滚

热门文章

  1. 域名解析类型:A记录、CNAME、MX记录、NS记录、TTL、TXT记录
  2. torch.meshgrid函数
  3. 黑马程序员Android学习笔记——金山卫士项目——第二天
  4. 蓄电池与超级电容混合储能并网matlab simulink仿真模型,混合储能采用低通滤波器进行功率分配
  5. 随着交互能力的升级,AI在C端的落地会越来越深
  6. 概率论之 拉普拉斯分布
  7. 【解决】Gmail账号无法正常在第三方客户端登录
  8. SOLIDWORKS“皮带/链”特征生成路径不能阵列的解决办法
  9. jmeter的负载测试
  10. 高斯滤波、双边滤波、邻域滤波、非局部均值滤波(NL-means) 笔记