一起来学设计模式(2)——简单工厂模式
来源:互联网 发布:c语言取反!用法 编辑:程序博客网 时间:2024/05/29 14:57
其实,在GoF的23种设计模式中,并没有简单工厂模式这种说法,为了和工厂模式 、抽象工厂模式逐一对比,我们还是先从简单工厂模式说起。
“工厂”即用来生产“产品”,考虑以下需求:
我需要通过一个类来创建一个苹果,或者是创建一个梨,或者是创建一个。
在上边的需求中,这个可以创建苹果、梨、香蕉的类即为简单工厂类。同时,苹果、梨、香蕉都为水果,可以继承自水果类。设计如下:
代码如下:
/*** @file SimpleFactory.h* @brief * @author Don Hao* @date 2011-9-1 15:20:40* @version * <pre><b>copyright: </b></pre>* <pre><b>email: </b>hao.limin@gmail.com</pre>* <pre><b>company: </b>http://blog.csdn.net/donhao</pre>* <pre><b>All rights reserved.</b></pre>* <pre><b>modification:</b></pre>* <pre>Write modifications here.</pre>*/#ifndef _SIMPLEFACTORY_H#define _SIMPLEFACTORY_H#include <iostream>#include <string>class Fruit{public: Fruit() { } virtual ~Fruit() { }};class Apple: public Fruit{public: Apple() { std::cout << "Apple" << std::endl; } virtual ~Apple() { }};class Pear : public Fruit{public: Pear() { std::cout << "Pear" << std::endl; } virtual ~Pear() { }};class Banana : public Fruit{public: Banana() { std::cout << "Banana" << std::endl; } virtual ~Banana() { }};class SimpleFactory{public: SimpleFactory() { } ~SimpleFactory() { } Fruit* createFruit(std::string str) { if ("Apple" == str) { return new Apple(); } if ("Pear" == str) { return new Pear(); } if ("Banana" == str) { return new Banana(); } else { std::cout << "Not Support" << std::endl; return NULL; } }};#endif /**< _SIMPLEFACTORY_H */
/*** @file SimpleFactory.cpp* @brief * @author Don Hao* @date 2011-9-1 15:20:39* @version * <pre><b>copyright: </b></pre>* <pre><b>email: </b>hao.limin@gmail.com</pre>* <pre><b>company: </b>http://blog.csdn.net/donhao</pre>* <pre><b>All rights reserved.</b></pre>* <pre><b>modification:</b></pre>* <pre>Write modifications here.</pre>*/#include "SimpleFactory.h"void main(){ SimpleFactory sf; sf.createFruit("Apple"); sf.createFruit("Pear"); sf.createFruit("Banana"); sf.createFruit("Watermelon");}
为了紧凑起见,类的定义放到了头文件中。
通过SimpleFactory可以创建不同的水果,其有以下几个明显的特点:
1. 通过一种标识(比如字符串或数字)来判断是创建何种产品。上边的示例中,通过传入的字符串来判断是创建Apple还是创建Pear等
2. 当需要增加一种新的类型的产品时,需要修改工厂方法
- 一起来学设计模式(2)——简单工厂模式
- 一起来学设计模式(3)——工厂模式
- 一起来学设计模式(4)——抽象工厂模式
- 一起来学设计模式(5)——适配器模式
- 【23种设计模式从零学2—简单工厂与工厂模式】
- 设计模式(2)——简单工厂设计模式
- 设计模式(java)2——简单工厂模式
- 设计模式——工厂模式(简单工厂)
- 一起来学设计模式(1)——单例模式
- 讲故事,学(Java)设计模式—工厂模式
- 讲故事,学(Java)设计模式—抽象工厂模式
- 设计模式之——工厂模式(简单工厂模式2)
- 设计模式系列——三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)
- 设计模式系列——三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)
- Qt设计模式系列——三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)
- 设计模式系列——三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)
- 设计模式系列——三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)
- 设计模式系列——三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)
- 如何应用Java中的静态内部类
- Sybase ASA 和 Sybase ASE 区别
- jQuery防止表单提交
- js判断浏览器版本
- Oracle 列与行还互转
- 一起来学设计模式(2)——简单工厂模式
- 常用ColorMatrixFilter
- minigui1.6移植到mini2440
- Linux启动分析— bootsect.S、setup.S、head.S分析
- 【按位DP】hdu 3555
- 14.VC(ui)-禁用拖动时显示窗口
- 整理
- Oracle中获得日期中的年份
- Java程序排序之选择排序