设计模式 (5)——工厂方法模式(Factory Method,创建型)
来源:互联网 发布:python set insert 编辑:程序博客网 时间:2024/05/22 03:30
1.概述
使用设计模式可以提高代码的可复用性、可扩充性和可维护性。工厂方法模式(Factory Method Pattern)属于创建型模式,定义一个创建对象的接口函数,但由子类决定实例化某一个类,让工厂类把实例化推迟到子类。
在前面的设计模式(四)——简单工厂模式中我们介绍了简单工厂模式,接下来将介绍下工厂方法模式,它同样是创建型设计模式,有相似之处,但又有些不同,文章的末尾会介绍他们之间的不同。
这里借用一下网上的资源,类图结构如下:
基类:抽象产品类。
子类:具体产品类。
工厂类:即抽象工厂类,提供了一个创建对象的方法,也称为“工厂方法”,该方法返回一个具体产品类的对象。
子类工厂:具体工厂类,实现抽象工厂类的“工厂方法”,来创建某个具体产品类实例。每一个子类工厂,负责创建一个具体产品类的对象。
2.工厂方法模式具体应用
请参考设计模式(四)——简单工厂模式这篇文章。 还是以生产比萨为例,比萨店需要根据客户订单,生产不同口味的比萨。这里比萨生产不是交由一个厨房生产,而是不同口味比萨交由不同厨房来专门制作。
还是以C++为例,首先实现我们的抽象比萨类和具体口味的比萨。
class Pizza {public: virtual string getDescription() = 0;};//蛤蜊比萨class ClamPizza :public Pizza { string name="蛤蜊比萨";public: string getDescription() { return name + " 价格45元"; }};//素食比萨class VeggiePizza :public Pizza { string name = "素食比萨";public: string getDescription() { return name+ " 价格26元";; }};//芝士比萨class CheesePizza :public Pizza { string name = "比萨";public: string getDescription() { return name + " 价格38元";; }};
下面实现抽象工厂和制作不同口味比萨的厨房。
//抽象工厂,提供创建创建对象的接口createPizza()class PizzaFactory {public: virtual Pizza* createPizza() = 0;};//具体工厂类,创建蛤蜊比萨class ClamPizzaFactory :PizzaFactory {public: virtual Pizza* createPizza() { return new ClamPizza; }};//具体工厂类,创建素食比萨class VeggiePizzaFactory :public PizzaFactory{public: virtual Pizza* createPizza() { return new VeggiePizza; } };//具体工厂类,创建芝士比萨class CheesePizzaFactory :public PizzaFactory {public: virtual Pizza* createPizza() { return new CheesePizza; }};
下面开始生产我们需要的比萨。
int main() { Pizza* clamPizza = (new ClamPizzaFactory)->createPizza(); //实例化蛤蜊比萨 cout<<clamPizza->getDescription()<<endl; Pizza* veggiePizza = (new VeggiePizzaFactory)->createPizza(); //实例化素食比萨 cout << veggiePizza->getDescription() << endl; Pizza* cheesePizza = (new CheesePizzaFactory)->createPizza(); //实例化芝士比萨 cout << cheesePizza->getDescription() << endl; system("pause");}
程序输出结果:
蛤蜊比萨 价格45元素食比萨 价格26元比萨 价格38元
工厂方法模式实现也比较简单,上面的类结构图如下所示:
3.简单工厂和工厂方法模式的比较
简单工厂模式:
专门定义一个工厂类负责创建其他类的实例,最大的优点在于工厂类中包含了必要的逻辑,根据客户需要的条件动态实例化相关的类。其缺点就是生产新产品时需要更改简单工厂类的代码,这违背了开放封闭原则。
工厂方法模式:
提供创建对象的接口,让子类去决定具体实例化的对象,把简单的内部逻辑判断移到了客户端代码。工厂方法克服了简单工厂违背开放封闭原则的缺点,又保持了封装对象创建过程的优点。
下一篇将讲解抽象工厂模式,并与二者进行对比。
4.小结
(1)工厂方法模式属于创建型模式,定义一个创建对象的接口函数,但由子类决定实例化某一个类,让工厂类把实例化推迟到子类。
(2)工厂方法模式坚持了依赖倒置原则,高层模块不依赖于底层模块,二者都依赖于抽象。高层模块是比萨店前台,底层模块是具体口味的披萨,二者都依赖抽象类Pizza。
参考文献
[1]简单工厂模式和工厂方法模式
- 设计模式 (5)——工厂方法模式(Factory Method,创建型)
- 设计模式学习(创建型模式)—工厂方法模式(Factory Method)
- 创建型模式5:工厂方法模式(Factory Method)
- 设计模式-创建型模式之 Factory Method(工厂方法)
- 【设计模式】创建型模式之工厂方法Factory Method
- JAVA设计模式(01):创建型-工厂模式【工厂方法模式】(Factory Method)
- JAVA设计模式(01):创建型-工厂模式【工厂方法模式】(Factory Method)
- JAVA设计模式(24):创建型-工厂模式【工厂方法模式】(Factory Method)
- JAVA设计模式(01_1):创建型-工厂模式【工厂方法模式】(Factory Method)
- JAVA设计模式(1) —<创建型>工厂方法模式(Factory Method)
- 设计模式之对象创建型 — Factory Method 工厂方法模式
- 设计模式(3)——工厂方法 Factory Method
- [设计模式-创建型]工厂方法(Factory Method)
- (2)设计模式之--创建型模式---工厂方法模式Factory Method
- 设计模式学习笔记--工厂方法模式(Factory Method Pattern)【创建型模式】
- 笔记5:Factory Method 工厂方法模式(创建型模式)
- 3. 工厂方法模式(Factory Method)---------- 创建型模式
- 一、创建型模式:工厂方法模式(Factory Method)
- 关于rem的个人见解
- CSS-overflow
- pdf解密工具
- Sumsets POJ
- python打包
- 设计模式 (5)——工厂方法模式(Factory Method,创建型)
- web前台
- 并查集
- Mac下修改Android Studio 所用的JDK版本
- android library引用失败,出现红叉叉解决办法
- 项目开发心得
- Linux下利用GDB调试快速找到Bug
- 关于寻找素因数的三种方法
- linux chmod 755