- 浏览: 355000 次
- 性别:
- 来自: 苏州
文章分类
- 全部博客 (335)
- C++ (190)
- 设计模式 (43)
- 数据库技术 (5)
- 网络编程 (11)
- 自动化测试 (6)
- Linux (13)
- OpenSSL (10)
- MS Crypt API (5)
- SCM (2)
- English (4)
- Android (10)
- EMV规范 (1)
- Saturn Platform (0)
- C (10)
- SQL (2)
- ASP.NET (3)
- 英语口语学习 (3)
- 调试工具 (21)
- 编译技术 (5)
- UML (1)
- 项目管理 (5)
- 敏捷开发 (2)
- Http Server (6)
- 代码审查、代码分析 (5)
- 面试基础 (10)
- 重点知识 (16)
- STL (6)
- Efficient C++资料 (8)
- 数据结构和算法 (7)
- 读书笔记 (0)
- 开源项目 (4)
- 多线程 (2)
- Console App (6)
- 个人开源项目 (4)
- IBM DevelopWorks (4)
- Java (16)
- 内存泄漏相关调试和检测 (13)
- 软件测试相关技术 (2)
- C# (11)
- Apple Related (1)
- 软件测试和管理 (2)
- EMV (1)
- Python (1)
- Node.js (6)
- JavaScript (5)
- VUE (1)
- Frontend (1)
- Backend (4)
- RESTful API (3)
- Firebase (3)
最新评论
-
u013189503:
来个密码吧
[C++][Logging] 项目中写日志模块的实现 -
wyf_vc:
来个密码啊!!
[C++][Logging] 项目中写日志模块的实现
1 概述
工厂模式专门负责将大量有共同接口的类实例化。工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类。工厂模式有以下几种形态:
a) 简单工厂(Simple Factory)模式
专门定义一个类来负责创建其它类的实例,被创建的实例通常都具有共同的父类。
注意:简单工厂模式并不包含在23种模式之内。
b) 工厂方法(Factory Method)模式,又称多形性工厂(Polymorphic Factory)模式
将对象的创建交由父类中定义的一个标准方法来完成,而不是其构造函数,究竟应该创建何种对象由具体的子类负责决定。通过继承来实现的。
c) 抽象工厂(Abstract Factory)模式,又称工具箱(Kit或Toolkit)模式
提供一个共同的接口来创建相互关联的多个对象。通过组合来实现的,但是抽象工厂中创建产品的方法通常是以“工厂方法”来实现的
GOF在《设计模式》一书中将工厂模式分为两类:工厂方法模式(Factory Method)与抽象工厂模式(Abstract Factory)。将简单工厂模式(Simple Factory)看为工厂方法模式的一种特例,两者归为一类。
2 说明
工厂方法用来处理对象的创建,并将这样的行为封装在子类中。这样,客户程序中关于超类的代码就和子类对象创建代码解耦了。
工厂模式定义:实例化对象,用工厂方法代替new操作。
工厂方法模式 抽象工厂模式
针对的是一个产品等级结构 针对的是面向多个产品等级结构
一个抽象产品类 多个抽象产品类
可以派生出多个具体产品类 每个抽象产品类可以派生出多个具体产品类
一个抽象工厂类,可以派生出多个具体工厂类 一个抽象工厂类,可以派生出多个具体工厂类
每个具体工厂类只能创建一个具体产品类的实例 每个具体工厂类可以创建多个具体产品类的实例
3小结
★工厂模式中,重要的是工厂类,而不是产品类。产品类可以是多种形式,多层继承或者是单个类都是可以的。但要明确的,工厂模式的接口只会返回一种类型的实例,这是在设计产品类的时候需要注意的,最好是有父类或者共同实现的接口。
★使用工厂模式,返回的实例一定是工厂创建的,而不是从其他对象中获取的。
★工厂模式返回的实例可以不是新创建的,返回由工厂创建好的实例也是可以的。
4 区别
简单工厂 : 用来生产同一等级结构中的任意产品。(对于增加新的产品,无能为力)
工厂方法 :用来生产同一等级结构中的固定产品。(支持增加任意产品)
抽象工厂 :用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)
简单工厂代码示例
工厂方法示例
抽象工厂示例
工厂模式专门负责将大量有共同接口的类实例化。工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类。工厂模式有以下几种形态:
a) 简单工厂(Simple Factory)模式
专门定义一个类来负责创建其它类的实例,被创建的实例通常都具有共同的父类。
注意:简单工厂模式并不包含在23种模式之内。
b) 工厂方法(Factory Method)模式,又称多形性工厂(Polymorphic Factory)模式
将对象的创建交由父类中定义的一个标准方法来完成,而不是其构造函数,究竟应该创建何种对象由具体的子类负责决定。通过继承来实现的。
c) 抽象工厂(Abstract Factory)模式,又称工具箱(Kit或Toolkit)模式
提供一个共同的接口来创建相互关联的多个对象。通过组合来实现的,但是抽象工厂中创建产品的方法通常是以“工厂方法”来实现的
GOF在《设计模式》一书中将工厂模式分为两类:工厂方法模式(Factory Method)与抽象工厂模式(Abstract Factory)。将简单工厂模式(Simple Factory)看为工厂方法模式的一种特例,两者归为一类。
2 说明
工厂方法用来处理对象的创建,并将这样的行为封装在子类中。这样,客户程序中关于超类的代码就和子类对象创建代码解耦了。
工厂模式定义:实例化对象,用工厂方法代替new操作。
工厂方法模式 抽象工厂模式
针对的是一个产品等级结构 针对的是面向多个产品等级结构
一个抽象产品类 多个抽象产品类
可以派生出多个具体产品类 每个抽象产品类可以派生出多个具体产品类
一个抽象工厂类,可以派生出多个具体工厂类 一个抽象工厂类,可以派生出多个具体工厂类
每个具体工厂类只能创建一个具体产品类的实例 每个具体工厂类可以创建多个具体产品类的实例
3小结
★工厂模式中,重要的是工厂类,而不是产品类。产品类可以是多种形式,多层继承或者是单个类都是可以的。但要明确的,工厂模式的接口只会返回一种类型的实例,这是在设计产品类的时候需要注意的,最好是有父类或者共同实现的接口。
★使用工厂模式,返回的实例一定是工厂创建的,而不是从其他对象中获取的。
★工厂模式返回的实例可以不是新创建的,返回由工厂创建好的实例也是可以的。
4 区别
简单工厂 : 用来生产同一等级结构中的任意产品。(对于增加新的产品,无能为力)
工厂方法 :用来生产同一等级结构中的固定产品。(支持增加任意产品)
抽象工厂 :用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)
简单工厂代码示例
class Light { public: virtual void TurnOn() = 0; virtual void TurnOff() = 0; }; class BulbLight : public Light { public: virtual void TurnOn() { cout << "Bulb Light is Turned on\n"; } virtual void TurnOff() { cout << "Bulb Light is Turned off\n"; } }; class TubeLight : public Light { public: virtual void TurnOn() { cout << "Tube Light is Turned on\n"; } virtual void TurnOff() { cout << "Tube Light is Turned off\n"; } }; typedef enum EM_LightType { LightType_Bulb, LightType_Tube, }LightType; class LightSimpleFactory { public: Light* Create(LightType emLightType) { if(LightType_Bulb == emLightType) { return new BulbLight(); } else if(LightType_Tube == emLightType) { return new TubeLight(); } else { return NULL; } } }; class LightSimpleFactoryTest { public: void run() { LightSimpleFactory* pFactory = new LightSimpleFactory(); Light* pLight = pFactory->Create(LightType_Bulb); pLight->TurnOn(); pLight->TurnOff(); delete pLight; cout <<"-----------------\n"; pLight = pFactory->Create(LightType_Tube); pLight->TurnOn(); pLight->TurnOff(); delete pLight; delete pFactory; } };
工厂方法示例
#ifndef FACTORY_H #define FACTORY_H #include <iostream> #include <string> #include <list> #include <cassert> using namespace std; //工厂模式 namespace Factory { //const definitions ////////////////////////////////////////////////////////////////////////// typedef list<string> ToppingList; ////////////////////////////////////////////////////////////////////////// class Pizza { public: const char* getName() { return m_Name.c_str(); } void prepare() { // class PizzaIngredientFactory // { // public: // Dough* creatDough() { return new Dough(); } // Sauce* creatSauce() { return new Sauce(); } // }; // PizzaIngredientFactory ingredientFactory; // // m_Dough = ingredientFactory.creatDough(); // m_Sauce = ingredientFactory.creatSauce(); cout << "Preparing " << m_Name.c_str() << endl; cout << "Tossing dough..." << endl; cout << "Adding sauce..." << endl; cout << "Adding topping: " << endl; ToppingList::const_iterator iter = m_Toppings.begin(); ToppingList::const_iterator end = m_Toppings.end(); for ( ; iter != end; ++iter) { cout << " " << (*iter).c_str(); } 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 official PizzaStore box" << endl; } protected: string m_Name; string m_Dough; string m_Sauce; ToppingList m_Toppings; }; ////////////////////////////////////////////////////////////////////////// class NYStyleCheesePizza : public Pizza { public: NYStyleCheesePizza() { m_Name = "NY Style Sauce and cheese Pizza"; m_Dough = "Thin Crust Dough"; m_Sauce = "Marinara Sauce"; m_Toppings.push_back(string("Grated Reggiano Cheese")); } }; ////////////////////////////////////////////////////////////////////////// class ChicagoStyleCheesePizza : public Pizza { public: ChicagoStyleCheesePizza() { m_Name = "Chicago Style Deep Dish cheese Pizza"; m_Dough = "Extra Thick Crust Dough"; m_Sauce = "Plum Tomato Sauce"; m_Toppings.push_back(string("Shredded Mozzarella Cheese")); } void cut() { cout << "Cutting the pizza into square slices" << endl; } }; ////////////////////////////////////////////////////////////////////////// class PizzaStore { public: Pizza* orderPizza( string type) { if (m_Pizza != NULL) { delete m_Pizza; m_Pizza = NULL; } m_Pizza = createPizza(type); if ( m_Pizza != NULL) { m_Pizza->prepare(); m_Pizza->bake(); m_Pizza->cut(); m_Pizza->box(); } return m_Pizza; } PizzaStore() : m_Pizza(NULL) {} virtual ~PizzaStore() { if (m_Pizza!=NULL) { delete m_Pizza; m_Pizza = NULL; } } protected: virtual Pizza* createPizza(string type) = 0; protected: Pizza* m_Pizza; }; //the factory ////////////////////////////////////////////////////////////////////////// class NYStylePizzaStore : public PizzaStore { public: virtual Pizza* createPizza(string type) { if (type == "cheese") { m_Pizza = new NYStyleCheesePizza(); } else if (type == "pepperoni") { //m_Pizza = new NYStylePepperoniPizza(); } else if (type=="clam") { //m_Pizza = new NYStyleClamPizza(); } else if (type=="veggie") { //m_Pizza = new NYStyleVeggiePizza(); } else { m_Pizza = NULL; } return m_Pizza; } }; ////////////////////////////////////////////////////////////////////////// class ChicgoStytlePizzaStore : public PizzaStore { public: virtual Pizza* createPizza(string type) { if (type == "cheese") { m_Pizza = new ChicagoStyleCheesePizza(); } else if (type == "pepperoni") { //m_Pizza = new ChicagoStylePepperoniPizza(); } else if (type=="clam") { //m_Pizza = new ChicagoStyleClamPizza(); } else if (type=="veggie") { //m_Pizza = new ChicagoStyleVeggiePizza(); } else { m_Pizza = NULL; } return m_Pizza; } }; ////////////////////////////////////////////////////////////////////////// class PizzaTestDrive { public: void run() { PizzaStore* nyStore = new NYStylePizzaStore(); PizzaStore* chicagoStore = new ChicgoStytlePizzaStore(); Pizza* pizza = nyStore->orderPizza("cheese"); assert(pizza != NULL); cout << "Ethan ordered a " << pizza->getName() << endl; pizza = chicagoStore->orderPizza("cheese"); assert(pizza != NULL); cout << "Joel ordered a " << pizza->getName() << endl; delete nyStore; delete chicagoStore; } }; }//namespace Factory #endif
抽象工厂示例
#include <iostream> using namespace std; class AbstractProductA { public: virtual ~AbstractProductA(){} protected: AbstractProductA(){} private: }; class AbstractProductB { public: virtual ~AbstractProductB(){} protected: AbstractProductB(){} }; class ProductA1 : public AbstractProductA { public: ProductA1() { cout<<"ProductA1..."<<endl; } ~ProductA1(){} }; class ProductA2 : public AbstractProductA { public: ProductA2() { cout<<"ProductA2..."<<endl; } ~ProductA2(){} }; class ProductB1 : public AbstractProductB { public: ProductB1() { cout<<"ProductB1..." << endl; } ~ProductB1(){} }; class ProductB2 : public AbstractProductB { public: ProductB2() { cout<<"ProductB2..." << endl; } ~ProductB2(){} }; ////////////////////////////////////////////////////////////////////////// class AbstractFactory { public: virtual ~AbstractFactory(){} virtual AbstractProductA *CreateProductA() = 0; virtual AbstractProductB *CreateProductB() = 0; protected: AbstractFactory(){} }; class ConcreteFactory1 : public AbstractFactory { public: ConcreteFactory1() { } ~ConcreteFactory1() { } AbstractProductA* CreateProductA() { return new ProductA1(); } AbstractProductB* CreateProductB() { return new ProductB1(); } }; class ConcreteFactory2 : public AbstractFactory { public: ConcreteFactory2(){} ~ConcreteFactory2(){} AbstractProductA *CreateProductA() { return new ProductA2(); } AbstractProductB *CreateProductB() { return new ProductB2(); } }; ////////////////////////////////////////////////////////////////////////// int main(int argc, char *argv[]) { AbstractFactory *cf1 = new ConcreteFactory1(); cf1->CreateProductA(); cf1->CreateProductB(); AbstractFactory *cf2 = new ConcreteFactory2(); cf2->CreateProductA(); cf2->CreateProductB(); return 0; }
- _结构型模式__head_first_设计模式之工厂模式_Factory__.zip (125.4 KB)
- 下载次数: 0
- SimpleFactoryPattern.zip (1.1 KB)
- 下载次数: 0
- FactoryMethodPattern.zip (1.2 KB)
- 下载次数: 0
发表评论
-
FreeRTOS
2022-03-05 16:31 211Ref https://blog.csdn.net/weix ... -
串口通讯相关
2018-11-02 13:44 365https://bbs.csdn.net/wap/topics ... -
[转]C++验证IP是否可以PING通
2018-10-30 17:54 1239https://www.cnblogs.com/guoyz13 ... -
C++/MFC 換皮膚
2018-10-20 11:05 427https://blog.csdn.net/u01123991 ... -
WinCE 截屏 - C++ 代碼
2018-08-31 09:45 527// this function create a bmp ... -
Android NDK搭建環境
2017-11-27 13:25 533https://www.cnblogs.com/ut2016- ... -
8583协议相关
2017-10-17 13:38 5188583相关资料,整理中... -
Java高级应用之JNI
2017-06-19 09:00 549参考link http://www.cnblogs.com/l ... -
C++实现ping功能
2017-04-18 11:21 2039基础知识 ping的过程是向目的IP发送一个type=8的I ... -
OpenSSL 编译环境搭建
2017-03-27 15:01 8611 安裝VS2008到 c:\Program Files (x ... -
最优非对称加密填充(OAEP)
2017-03-25 14:53 1519OpenSSL命令---rsautl http://blog. ... -
[Platform Builder] 设置SVM OS build Env
2016-11-10 11:39 01 copy one OSDesign Project to ... -
[Windows] System Error Codes(GetLastError )0-----5999
2016-10-26 13:28 1837ERROR_SUCCESS 0 (0x0) T ... -
开源Windows驱动程序框架
2016-09-17 21:35 818转自 http://code.csdn.net/news/28 ... -
c/c++代码中执行cmd命令
2016-09-14 14:50 1819转自 http://blog.csdn.net/slixinx ... -
C#使用C++标准DLL实例(包含callback)
2016-09-11 19:44 1005C++编写标准Win32DLL如下 头文件 /***** ... -
C#调用C++的DLL搜集整理的所有数据类型转换方式
2016-09-09 16:07 928转自 http://www.cnblogs.com/zeroo ... -
WinCE CPU使用率计算 测试工具
2016-09-08 16:14 939转自 http://blog.csdn.net/jan ... -
switch在C++与C#中的一些差异
2016-09-08 15:19 762参考链接 http://blog.csdn.net/weiwe ... -
C++ 鼠标模拟程序
2016-09-04 12:09 1537转自 http://blog.csdn.net/weixinh ...
相关推荐
Head First 设计模式 (四) 工厂模式(factory pattern) C++实现
《HeadFirst设计模式》(中文版)共有14章,每章都介绍了几个设计模式,完整地涵盖了四人组版本全部23个设计模式。前言先介绍这本书的用法;第1章到第11章陆续介绍的设计模式为Strategy、Observer、Decorator、...
《Head First设计模式》(中文版)共有14章,每章都介绍了几个设计模式,完整地涵盖了四人组版本全部23个设计模式。前言先介绍这本书的用法;第1章到第11章陆续介绍的设计模式为Strategy、Observer、Decorator、...
《Head First设计模式》(中文版)共有14章,每章都介绍了几个设计模式,完整地涵盖了四人组版本全部23个设计模式。前言先介绍这本书的用法;第1章到第11章陆续介绍的设计模式为Strategy、Observer、Decorator、...
《Head First设计模式》(中文版)共有14章,每章都介绍了几个设计模式,完整地涵盖了四人组版本全部23个设计模式。前言先介绍这本书的用法;第1章到第11章陆续介绍的设计模式为Strategy、Observer、Decorator、...
《Head First设计模式》(中文版)共有14章,每章都介绍了几个设计模式,完整地涵盖了四人组版本全部23个设计模式。前言先介绍这本书的用法;第1章到第 11章陆续介绍的设计 5b4 式为Strategy、Observer、Decorator、...
《Head First设计模式》(中文版)共有14章,每章都介绍了几个设计模式,完整地涵盖了四人组版本全部23个设计模式。前言先介绍这本书的用法;第1章到第11章陆续介绍的设计模式为Strategy、Observer、Decorator、...
《Head First设计模式》(中文版)共有14章,每章都介绍了几个设计模式,完整地涵盖了四人组版本全部23个设计模式。前言先介绍这本书的用法;第1章到第11章陆续介绍的设计模式为Strategy、Observer、Decorator、...
《Head First设计模式》(中文版)共有14章,每章都介绍了几个设计模式,完整地涵盖了四人组版本全部23个设计模式。前言先介绍这本书的用法;第1章到第11章陆续介绍的设计模式为Strategy、Observer、Decorator、...
《HeadFirst设计模式》(中文版)共有14章,每章都介绍了几个设计模式,完整地涵盖了四人组版本全部23个设计模式。前言先介绍这本书的用法;第1章到第11章陆续介绍的设计模式为Strategy、Observer、Decorator、...
第1章到第11章陆续介绍的设计模式为Strategy、Observer、Decorator、Abstract Factory、Factory Method、Singleton、Command、Adapter、Facade、Templat Method、Iterator、Composite、State、Proxy。*后三章比较...
《HeadFirst设计模式》(中文版)共有14章,每章都介绍了几个设计模式,完整地涵盖了四人组版本全部23个设计模式。前言先介绍这本书的用法;第1章到第11章陆续介绍的设计模式为Strategy、Observer、Decorator、...
《Head First设计模式》作者Eric Freeman;ElElisabeth Freeman是作家、讲师和技术顾问。本书的产品设计应用神经生物学、认知科学,以及学习理论,这使得这本书能够将这些知识深深地印在你的脑海里,不容易被遗忘。...
《Head First设计模式(中文版)》的产品设计应用神经生物学、认知科学,以及学习理论,这使得此书能够将这些知识深深地印在你的脑海里,不容易被遗忘。《Head First Design Patterns》的编写方式采用引导式教学,不...
第1章至第11章陆续介绍了设计模式:Strategy、Observer、Decorator、Abstract Factory、Factory Method、Singleton、Command、Adapter、Facade、TemplatMethod、Iterator、Composite、State、Proxy。
《Head First设计模式》(中文版)共有14章,每章都介绍了几个设计模式,完整地涵盖了四人组版本全部23个设计模式。前言先介绍这本书的用法;第1章到第11章陆续介绍的设计模式为Strategy、Observer、Decorator、...