- 浏览: 375820 次
- 性别:
- 来自: 苏州
-
文章分类
- 全部博客 (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 259Ref https://blog.csdn.net/weix ... -
串口通讯相关
2018-11-02 13:44 423https://bbs.csdn.net/wap/topics ... -
[转]C++验证IP是否可以PING通
2018-10-30 17:54 1354https://www.cnblogs.com/guoyz13 ... -
C++/MFC 換皮膚
2018-10-20 11:05 489https://blog.csdn.net/u01123991 ... -
WinCE 截屏 - C++ 代碼
2018-08-31 09:45 587// this function create a bmp ... -
Android NDK搭建環境
2017-11-27 13:25 605https://www.cnblogs.com/ut2016- ... -
8583协议相关
2017-10-17 13:38 5948583相关资料,整理中... -
Java高级应用之JNI
2017-06-19 09:00 614参考link http://www.cnblogs.com/l ... -
C++实现ping功能
2017-04-18 11:21 2192基础知识 ping的过程是向目的IP发送一个type=8的I ... -
OpenSSL 编译环境搭建
2017-03-27 15:01 9221 安裝VS2008到 c:\Program Files (x ... -
最优非对称加密填充(OAEP)
2017-03-25 14:53 1606OpenSSL命令---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 1893ERROR_SUCCESS 0 (0x0) T ... -
开源Windows驱动程序框架
2016-09-17 21:35 885转自 http://code.csdn.net/news/28 ... -
c/c++代码中执行cmd命令
2016-09-14 14:50 1938转自 http://blog.csdn.net/slixinx ... -
C#使用C++标准DLL实例(包含callback)
2016-09-11 19:44 1105C++编写标准Win32DLL如下 头文件 /***** ... -
C#调用C++的DLL搜集整理的所有数据类型转换方式
2016-09-09 16:07 979转自 http://www.cnblogs.com/zeroo ... -
WinCE CPU使用率计算 测试工具
2016-09-08 16:14 1017转自 http://blog.csdn.net/jan ... -
switch在C++与C#中的一些差异
2016-09-08 15:19 831参考链接 http://blog.csdn.net/weiwe ... -
C++ 鼠标模拟程序
2016-09-04 12:09 1632转自 http://blog.csdn.net/weixinh ...
相关推荐
工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂模式中,当客户端请求创建一个产品对象时,它只需要一个具体工厂类的引用,而不需要知道如何构造这些对象的细节。这种模式的核心在于封装了...
创建型模式关注对象的创建,如单例模式(Singleton)、工厂模式(Factory Method)和建造者模式(Builder)等,它们旨在控制实例化过程,降低类之间的耦合度。结构型模式关注如何组合现有的组件以形成更复杂的结构,...
总的来说,这个压缩包包含的资源可以帮助你深入理解设计模式,通过《HeadFirst设计模式》和《HeadFirst in Java》的源码,你可以学习到如何在实际项目中应用这些模式。而UML类图则提供了直观的视角,便于你把握设计...
《HeadFirst设计模式》是一本深受开发者欢迎的书籍,它以独特、易理解的方式介绍了软件设计中的重要概念——设计模式。设计模式是经验丰富的开发者在解决常见问题时总结出的最佳实践,它们为软件设计提供了可复用的...
其中,创建型模式如工厂方法(Factory Method)、抽象工厂(Abstract Factory)、单例(Singleton)和建造者(Builder)模式等,用于创建对象时提供更灵活和优雅的解决方案。结构型模式如适配器(Adapter)、外观...
创建型模式关注对象的创建,如单例模式(Singleton)、工厂方法模式(Factory Method)和抽象工厂模式(Abstract Factory)等,它们提供了一种在不指定具体对象的情况下创建对象的方法。结构型模式关注如何组合对象...
创建型模式关注于对象的创建,如单例模式(Singleton)、工厂模式(Factory Method)和抽象工厂模式(Abstract Factory)。结构型模式涉及如何组合类和对象以获得更大的结构,如适配器模式(Adapter)、装饰器模式...
《Head First 设计模式》的英文版是一本面向初学者的设计模式入门书籍,它以幽默风趣的文风,深入浅出地介绍了软件设计中经常使用的设计模式。设计模式是一套被反复使用、多数人知晓、经过分类编目、代码设计经验的...
1. 创建型模式:如单例(Singleton)、工厂方法(Factory Method)、抽象工厂(Abstract Factory)、建造者(Builder)和原型(Prototype)。这些模式关注于对象的创建,帮助我们在不指定具体类的情况下,创建和管理...
《HeadFirst设计模式JAVA版源码》是一份深入学习设计模式的重要资源,它基于流行的编程语言Java,旨在帮助开发者理解并应用设计模式于实际项目中。设计模式是软件工程中的重要概念,它代表了在特定场景下解决问题的...
1. **创建型模式**:包括单例模式(Singleton)、工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory)、建造者模式(Builder)和原型模式(Prototype)。这些模式主要关注对象的创建过程,使得对象的...
创建型模式关注对象的创建过程,如单例模式(Singleton)、工厂模式(Factory Method)、抽象工厂模式(Abstract Factory)、建造者模式(Builder)和原型模式(Prototype)。这些模式帮助我们控制对象的实例化过程...
2. **创建型模式**:包括单例(Singleton)、工厂方法(Factory Method)、抽象工厂(Abstract Factory)、建造者(Builder)和原型(Prototype)模式。这些模式关注对象的创建过程,帮助我们隔离对象的创建细节,...
第1章到第11章陆续介绍的设计模式为Strategy、Observer、Decorator、Abstract Factory、Factory Method、Singleton、Command、Adapter、Facade、Template Method、iterator、Composite、State、proxy。最后三章比较...
创建型模式关注对象的创建,如单例模式(Singleton)、工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory)等,它们提供了创建对象的灵活方式,使得系统在运行时可以动态决定创建哪种类型的对象。...
创建型模式关注对象的创建过程,如单例模式(Singleton)、工厂模式(Factory)和抽象工厂模式(Abstract Factory),它们旨在提供更灵活、可扩展的构造机制。结构型模式关注如何组合现有对象来形成更大的结构,例如...