- 浏览: 370022 次
- 性别:
- 来自: 苏州
文章分类
- 全部博客 (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)用户进入店面,来到柜台前(其实就是SimpleFactory类);
(2)通过和柜台人员的沟通选择某一品牌的轮胎(类似SampleFactory中的CreateProduct),不同品牌的轮胎具有不同的代号;
(3)选择品牌后,拿出该品牌合适的轮胎(ConcreteProduct),最后提供给客户;
头文件
//SimapleFactoryPattern.h #ifndef SIMPLE_FACTORY_PATTERN_H #define SIMPLE_FACTORY_PATTERN_H #include <Windows.h> namespace SimpleFactoryPattern { // Base Class ////////////////////////////////////////////////////////////////////////// class AbstractProduct { public: AbstractProduct(); virtual ~AbstractProduct(); virtual void DisplayProductInfo() = 0; }; ////////////////////////////////////////////////////////////////////////// class ConcreteAbstractProductA : public AbstractProduct { public: ConcreteAbstractProductA(); virtual ~ConcreteAbstractProductA(); virtual void DisplayProductInfo(); }; ////////////////////////////////////////////////////////////////////////// class ConcreteAbstractProductB : public AbstractProduct { public: ConcreteAbstractProductB(); virtual ~ConcreteAbstractProductB(); virtual void DisplayProductInfo(); }; ////////////////////////////////////////////////////////////////////////// class SimpleFactory { public: SimpleFactory(); ~SimpleFactory(); static AbstractProduct* GetProduct(byte byType) { AbstractProduct* pTempOp = NULL; switch(byType) { case 0: pTempOp = new ConcreteAbstractProductA(); break; case 1: pTempOp = new ConcreteAbstractProductB(); break; default: break; } return pTempOp; } }; ////////////////////////////////////////////////////////////////////////// void SimpleFactoryPattern_Test_0(); void SimpleFactoryPattern_Test_1(); } #endif
实现
#include "SimpleFactoryPattern.h" #include <iostream> using namespace std; namespace SimpleFactoryPattern { ////////////////////////////////////////////////////////////////////////// AbstractProduct::AbstractProduct() { } AbstractProduct::~AbstractProduct() { } ////////////////////////////////////////////////////////////////////////// ConcreteAbstractProductA::ConcreteAbstractProductA() { } ConcreteAbstractProductA::~ConcreteAbstractProductA() { } void ConcreteAbstractProductA::DisplayProductInfo() { cout << "ConcreteAbstractProductA \n"; } ////////////////////////////////////////////////////////////////////////// ConcreteAbstractProductB::ConcreteAbstractProductB() { } ConcreteAbstractProductB::~ConcreteAbstractProductB() { } void ConcreteAbstractProductB::DisplayProductInfo() { cout << "ConcreteAbstractProductB \n"; } ////////////////////////////////////////////////////////////////////////// SimpleFactory::SimpleFactory() { } SimpleFactory::~SimpleFactory() { } ////////////////////////////////////////////////////////////////////////// void SimpleFactoryPattern_Test_0() { AbstractProduct* pCurOP = NULL; pCurOP = SimpleFactory::GetProduct(0); pCurOP->DisplayProductInfo(); delete pCurOP; pCurOP = NULL; } void SimpleFactoryPattern_Test_1() { AbstractProduct* pCurOP = NULL; pCurOP = SimpleFactory::GetProduct(1); pCurOP->DisplayProductInfo(); delete pCurOP; pCurOP = NULL; } }
客户端代码
#include "SimpleFactoryPattern.h" #include <iostream> using namespace std; using namespace SimpleFactoryPattern; void main( ) { SimpleFactoryPattern_Test_0(); SimpleFactoryPattern_Test_1(); }
运行结果
工厂方法模式
我的理解:
假设你需要更换轮胎,你可以选择去一些私人开的小店面;可以去轮胎大卖场;也可以去汽配城。
假设你的车是豪车,那么前面的小店面肯定是无法满足你的需求,你可以选择一个轮胎大卖场;这时候每一种品牌的轮胎都集中在一个柜台,这样的情况就好像工厂模式一样。一个柜台和多个柜台起本质都是柜台,也可以理解为简单工厂是工厂方法的一个特例。
流程:
用户代表了客户端的行为,所以逻辑如下:
(1)用户进入大型的轮胎卖场,并选择一个专卖柜台(每一个柜台其实就是一个ConcreteFactory);
(2)通过和柜台人员的沟通选择某一品牌的轮胎(ConcreteProduct);
(3)拿出该品牌合适的轮胎,最后提供给客户;
头文件
//FactoryMethodPattern.h #ifndef FACTORY_METHOD_PATTERN_H #define FACTORY_METHOD_PATTERN_H #include <Windows.h> namespace FactoryMethodPattern { // Base Class ////////////////////////////////////////////////////////////////////////// class AbstractProduct { public: AbstractProduct(); virtual ~AbstractProduct(); virtual void DisplayProductInfo() = 0; }; // ////////////////////////////////////////////////////////////////////////// // class ConcreteAbstractProductA : public AbstractProduct // { // public: // ConcreteAbstractProductA(); // virtual ~ConcreteAbstractProductA(); // // virtual void DisplayProductInfo(); // }; // // ////////////////////////////////////////////////////////////////////////// // class ConcreteAbstractProductB : public AbstractProduct // { // public: // ConcreteAbstractProductB(); // virtual ~ConcreteAbstractProductB(); // // virtual void DisplayProductInfo(); // }; ////////////////////////////////////////////////////////////////////////// class AbstractFactory { public: AbstractFactory(); ~AbstractFactory(); virtual AbstractProduct* GetProduct() = 0; }; // class ConcreteFactoryA : public AbstractFactory // { // public: // ConcreteFactoryA(); // virtual ~ConcreteFactoryA(); // // virtual AbstractProduct* GetProduct(); // }; // class ConcreteFactoryB: public AbstractFactory // { // public: // ConcreteFactoryB(); // virtual ~ConcreteFactoryB(); // // virtual AbstractProduct* GetProduct() ; // }; ////////////////////////////////////////////////////////////////////////// void FactoryMethodPattern_Test_A(); void FactoryMethodPattern_Test_B(); } #endif
实现
#include "FactoryMethodPattern.h" #include <iostream> using namespace std; namespace FactoryMethodPattern { ////////////////////////////////////////////////////////////////////////// class ConcreteAbstractProductA : public AbstractProduct { public: ConcreteAbstractProductA(); virtual ~ConcreteAbstractProductA(); virtual void DisplayProductInfo(); }; ////////////////////////////////////////////////////////////////////////// class ConcreteAbstractProductB : public AbstractProduct { public: ConcreteAbstractProductB(); virtual ~ConcreteAbstractProductB(); virtual void DisplayProductInfo(); }; class ConcreteFactoryA : public AbstractFactory { public: ConcreteFactoryA(); virtual ~ConcreteFactoryA(); virtual AbstractProduct* GetProduct(); }; class ConcreteFactoryB: public AbstractFactory { public: ConcreteFactoryB(); virtual ~ConcreteFactoryB(); virtual AbstractProduct* GetProduct() ; }; ////////////////////////////////////////////////////////////////////////// AbstractProduct::AbstractProduct() { } AbstractProduct::~AbstractProduct() { } ////////////////////////////////////////////////////////////////////////// ConcreteAbstractProductA::ConcreteAbstractProductA() { } ConcreteAbstractProductA::~ConcreteAbstractProductA() { } void ConcreteAbstractProductA::DisplayProductInfo() { cout << "ConcreteAbstractProductA\n"; } ////////////////////////////////////////////////////////////////////////// ConcreteAbstractProductB::ConcreteAbstractProductB() { } ConcreteAbstractProductB::~ConcreteAbstractProductB() { } void ConcreteAbstractProductB::DisplayProductInfo() { cout << "ConcreteAbstractProductB\n"; } ////////////////////////////////////////////////////////////////////////// AbstractFactory::AbstractFactory() { } AbstractFactory::~AbstractFactory() { } ////////////////////////////////////////////////////////////////////////// ConcreteFactoryA::ConcreteFactoryA() { } ConcreteFactoryA::~ConcreteFactoryA() { } AbstractProduct* ConcreteFactoryA::GetProduct() { return new ConcreteAbstractProductA(); } ////////////////////////////////////////////////////////////////////////// ConcreteFactoryB::ConcreteFactoryB() { } ConcreteFactoryB::~ConcreteFactoryB() { } AbstractProduct* ConcreteFactoryB::GetProduct() { return new ConcreteAbstractProductB(); } ////////////////////////////////////////////////////////////////////////// void FactoryMethodPattern_Test_A() { AbstractFactory* pCurFactory = new ConcreteFactoryA(); AbstractProduct* pCurOp = pCurFactory->GetProduct(); pCurOp->DisplayProductInfo(); delete pCurOp; pCurOp = NULL; delete pCurFactory; pCurFactory = NULL; } void FactoryMethodPattern_Test_B() { AbstractFactory* pCurFactory = new ConcreteFactoryB(); AbstractProduct* pCurOp = pCurFactory->GetProduct(); pCurOp->DisplayProductInfo(); delete pCurOp; pCurOp = NULL; delete pCurFactory; pCurFactory = NULL; } }
客户端代码
#include "Factory.h" #include "Product.h" #include "FactoryMethodPattern.h" #include <iostream> using namespace std; using namespace FactoryMethodPattern; void main() { FactoryMethodPattern_Test_A(); FactoryMethodPattern_Test_B(); }
运行结果
抽象工厂模式
我的理解:
假设你需要更换轮胎,你可以选择去一些私人开的小店面;可以去轮胎大卖场;也可以去汽配城。
假设你还需要润滑油,你优先选择了汽配城一起购买;不然的话你可能得多跑一趟;那么这个时候你的需求就是两个,这两个需求可以理解为一个产品族,概念图如右:
流程:
用户代表了客户端的行为,所以逻辑如下:
(1)用户进入汽配城,选择一个轮胎专卖柜台(每一个柜台其实就是一个ConcreteFactory);
(2)通过和柜台人员的沟通选择某一品牌的轮胎(ConcreteProduct);
(3)拿出该品牌合适的轮胎,最后提供给客户;
(4)再选择一个润滑油专卖柜台(每一个柜台其实就是一个ConcreteFactory);
(5)通过和柜台人员的沟通选择某一品牌的润滑油(ConcreteProduct);
(6)拿出该品牌合适的润滑油,最后提供给客户;
头文件
//AbstractFactoryPattern.h #ifndef ABSTRACY_FACTORY_PATTERN_H #define ABSTRACY_FACTORY_PATTERN_H #include <Windows.h> #include <string> using namespace std; namespace AbstractFactoryPattern { ////////////////////////////////////////////////////////////////////////// class AbstractProductA { public: AbstractProductA(); virtual ~AbstractProductA(); virtual void DisplayProductAInfo() = 0; }; // ////////////////////////////////////////////////////////////////////////// // class ConcreteAbstractProductA1 : public AbstractProductA // { // public: // ConcreteAbstractProductA1(); // virtual ~ConcreteAbstractProductA1(); // // virtual void DisplayProductAInfo(); // }; // // ////////////////////////////////////////////////////////////////////////// // class ConcreteAbstractProductA2 : public AbstractProductA // { // public: // ConcreteAbstractProductA2(); // virtual ~ConcreteAbstractProductA2(); // // virtual void DisplayProductAInfo(); // }; ////////////////////////////////////////////////////////////////////////// class AbstractProductB { public: AbstractProductB(); virtual ~AbstractProductB(); virtual void DisplayProductBInfo() = 0; }; // ////////////////////////////////////////////////////////////////////////// // class ConcreteAbstractProductB1 : public AbstractProductB // { // public: // ConcreteAbstractProductB1(); // virtual ~ConcreteAbstractProductB1(); // // virtual void DisplayProductBInfo(); // }; // // ////////////////////////////////////////////////////////////////////////// // class ConcreteAbstractProductB2 : public AbstractProductB // { // public: // ConcreteAbstractProductB2(); // virtual ~ConcreteAbstractProductB2(); // // virtual void DisplayProductBInfo(); // }; ////////////////////////////////////////////////////////////////////////// class AbstractFactory { public: AbstractFactory(); ~AbstractFactory(); virtual AbstractProductA* GetProductA() = 0; virtual AbstractProductB* GetProductB() = 0; }; // class ConcreteFactory1 : public AbstractFactory // { // public: // ConcreteFactory1(); // virtual ~ConcreteFactory1(); // // virtual AbstractProductA* GetProductA(); // virtual AbstractProductB* GetProductB(); // }; // class ConcreteFactory2: public AbstractFactory // { // public: // ConcreteFactory2(); // virtual ~ConcreteFactory2(); // // virtual AbstractProductA* GetProductA() ; // virtual AbstractProductB* GetProductB(); // }; ////////////////////////////////////////////////////////////////////////// void AbstractFactoryPattern_Test_1(); void AbstractFactoryPattern_Test_2(); } #endif
实现
#include "AbstractFactoryPattern.h" #include <iostream> using namespace std; namespace AbstractFactoryPattern { ////////////////////////////////////////////////////////////////////////// class ConcreteAbstractProductA1 : public AbstractProductA { public: ConcreteAbstractProductA1(); virtual ~ConcreteAbstractProductA1(); virtual void DisplayProductAInfo(); }; ////////////////////////////////////////////////////////////////////////// class ConcreteAbstractProductA2 : public AbstractProductA { public: ConcreteAbstractProductA2(); virtual ~ConcreteAbstractProductA2(); virtual void DisplayProductAInfo(); }; ////////////////////////////////////////////////////////////////////////// class ConcreteAbstractProductB1 : public AbstractProductB { public: ConcreteAbstractProductB1(); virtual ~ConcreteAbstractProductB1(); virtual void DisplayProductBInfo(); }; ////////////////////////////////////////////////////////////////////////// class ConcreteAbstractProductB2 : public AbstractProductB { public: ConcreteAbstractProductB2(); virtual ~ConcreteAbstractProductB2(); virtual void DisplayProductBInfo(); }; ////////////////////////////////////////////////////////////////////////// class ConcreteFactory1 : public AbstractFactory { public: ConcreteFactory1(); virtual ~ConcreteFactory1(); virtual AbstractProductA* GetProductA(); virtual AbstractProductB* GetProductB(); }; class ConcreteFactory2: public AbstractFactory { public: ConcreteFactory2(); virtual ~ConcreteFactory2(); virtual AbstractProductA* GetProductA() ; virtual AbstractProductB* GetProductB(); }; ////////////////////////////////////////////////////////////////////////// AbstractProductA::AbstractProductA() { } AbstractProductA::~AbstractProductA() { } ConcreteAbstractProductA1::ConcreteAbstractProductA1() { } ConcreteAbstractProductA1::~ConcreteAbstractProductA1() { } void ConcreteAbstractProductA1::DisplayProductAInfo() { cout << "ConcreteAbstractProductA1\n"; } ConcreteAbstractProductA2::ConcreteAbstractProductA2() { } ConcreteAbstractProductA2::~ConcreteAbstractProductA2() { } void ConcreteAbstractProductA2::DisplayProductAInfo() { cout << "ConcreteAbstractProductA2\n"; } ////////////////////////////////////////////////////////////////////////// AbstractProductB::AbstractProductB() { } AbstractProductB::~AbstractProductB() { } ConcreteAbstractProductB1::ConcreteAbstractProductB1() { } ConcreteAbstractProductB1::~ConcreteAbstractProductB1() { } void ConcreteAbstractProductB1::DisplayProductBInfo() { cout << "ConcreteAbstractProductB1\n"; } ConcreteAbstractProductB2::ConcreteAbstractProductB2() { } ConcreteAbstractProductB2::~ConcreteAbstractProductB2() { } void ConcreteAbstractProductB2::DisplayProductBInfo() { cout << "ConcreteAbstractProductB2\n"; } ////////////////////////////////////////////////////////////////////////// AbstractFactory::AbstractFactory() { } AbstractFactory::~AbstractFactory() { } ////////////////////////////////////////////////////////////////////////// ConcreteFactory1::ConcreteFactory1() { } ConcreteFactory1::~ConcreteFactory1() { } AbstractProductA* ConcreteFactory1::GetProductA() { return new ConcreteAbstractProductA1(); } AbstractProductB* ConcreteFactory1::GetProductB() { return new ConcreteAbstractProductB1(); } ////////////////////////////////////////////////////////////////////////// ConcreteFactory2::ConcreteFactory2() { } ConcreteFactory2::~ConcreteFactory2() { } AbstractProductA* ConcreteFactory2::GetProductA() { return new ConcreteAbstractProductA2(); } AbstractProductB* ConcreteFactory2::GetProductB() { return new ConcreteAbstractProductB2(); } ////////////////////////////////////////////////////////////////////////// void AbstractFactoryPattern_Test_1() { AbstractFactory* pCurFactory = new ConcreteFactory1(); AbstractProductA* pCurProfuctA = pCurFactory->GetProductA(); AbstractProductB* pCurProfuctB = pCurFactory->GetProductB(); pCurProfuctA->DisplayProductAInfo(); pCurProfuctB->DisplayProductBInfo(); delete pCurProfuctB; pCurProfuctB = NULL; delete pCurProfuctA; pCurProfuctA = NULL; delete pCurFactory; pCurFactory = NULL; } void AbstractFactoryPattern_Test_2() { AbstractFactory* pCurFactory = new ConcreteFactory2(); AbstractProductA* pCurProfuctA = pCurFactory->GetProductA(); AbstractProductB* pCurProfuctB = pCurFactory->GetProductB(); pCurProfuctA->DisplayProductAInfo(); pCurProfuctB->DisplayProductBInfo(); delete pCurProfuctB; pCurProfuctB = NULL; delete pCurProfuctA; pCurProfuctA = NULL; delete pCurFactory; pCurFactory = NULL; } }
客户端代码
#include "SimpleFactoryPattern.h" #include <iostream> using namespace std; using namespace AbstractFactoryPattern; void main() { AbstractFactoryPattern_Test_1(); AbstractFactoryPattern_Test_2(); }
运行结果
- Diagram.zip (996.3 KB)
- 下载次数: 0
- Diagram-Raw.zip (170.4 KB)
- 下载次数: 0
- FactoryPattern.zip (3.6 KB)
- 下载次数: 0
发表评论
-
FreeRTOS
2022-03-05 16:31 248Ref https://blog.csdn.net/weix ... -
串口通讯相关
2018-11-02 13:44 411https://bbs.csdn.net/wap/topics ... -
[转]C++验证IP是否可以PING通
2018-10-30 17:54 1326https://www.cnblogs.com/guoyz13 ... -
C++/MFC 換皮膚
2018-10-20 11:05 477https://blog.csdn.net/u01123991 ... -
WinCE 截屏 - C++ 代碼
2018-08-31 09:45 574// this function create a bmp ... -
Android NDK搭建環境
2017-11-27 13:25 580https://www.cnblogs.com/ut2016- ... -
8583协议相关
2017-10-17 13:38 5738583相关资料,整理中... -
Java高级应用之JNI
2017-06-19 09:00 600参考link http://www.cnblogs.com/l ... -
C++实现ping功能
2017-04-18 11:21 2155基础知识 ping的过程是向目的IP发送一个type=8的I ... -
OpenSSL 编译环境搭建
2017-03-27 15:01 9061 安裝VS2008到 c:\Program Files (x ... -
最优非对称加密填充(OAEP)
2017-03-25 14:53 1582OpenSSL命令---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 1881ERROR_SUCCESS 0 (0x0) T ... -
开源Windows驱动程序框架
2016-09-17 21:35 871转自 http://code.csdn.net/news/28 ... -
c/c++代码中执行cmd命令
2016-09-14 14:50 1908转自 http://blog.csdn.net/slixinx ... -
C#使用C++标准DLL实例(包含callback)
2016-09-11 19:44 1086C++编写标准Win32DLL如下 头文件 /***** ... -
C#调用C++的DLL搜集整理的所有数据类型转换方式
2016-09-09 16:07 969转自 http://www.cnblogs.com/zeroo ... -
WinCE CPU使用率计算 测试工具
2016-09-08 16:14 991转自 http://blog.csdn.net/jan ... -
switch在C++与C#中的一些差异
2016-09-08 15:19 810参考链接 http://blog.csdn.net/weiwe ... -
C++ 鼠标模拟程序
2016-09-04 12:09 1612转自 http://blog.csdn.net/weixinh ...
相关推荐
学习这个模式时,需要注意理解抽象工厂模式与其他创建型模式(如简单工厂、工厂方法和建造者模式)的区别,以及如何在实际项目中合理选择和应用。同时,也要关注模式的优缺点,例如它能很好地封装变化,但可能会导致...
Java设计模式是软件开发中的重要概念,它们是解决常见...这个压缩包资料“[浪曦原创]JAVA设计模式 第2讲 单态模式和简单工厂模式(jzkangta)”应包含了详细的讲解和示例代码,可以帮助深入理解和应用这两种设计模式。
1. 创建型设计模式:这类模式关注对象的创建过程,它们包括单例模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式。单例模式确保一个类只有一个实例,并提供全局访问点;工厂方法模式定义一个用于创建对象的...
设计模式分为三大类:创建型模式(Creational Patterns)、结构型模式(Structural Patterns)和行为型模式(Behavioral Patterns)。这些模式都有其独特的应用场景和目标,下面将对每一类模式进行详细介绍。 1. ...
1. 创建型模式:关注对象的创建,比如工厂模式(用于创建对象而不暴露创建逻辑)、抽象工厂模式(提供一个创建一系列相关或相互依赖对象的接口)、单例模式(确保一个类只有一个实例)、建造者模式(将复杂对象的...
工厂模式是一种创建型设计模式,提供了一种创建对象的最佳方式。在C#中,可以通过定义一个创建对象的接口,让子类决定实例化哪一个类,从而使代码更灵活,易于扩展。 三、抽象工厂模式(Abstract Factory) 抽象...
6. YXShop.DALFactory、SQLProfileDAL、YXShop.Bll、YXShop.DBUtility、YXShop.DALProfile - 这些是源码的不同部分,分别代表数据访问层(DAL)、业务逻辑层(BLL)、数据库实用工具和数据访问层的工厂模式实现。...
2. **自定义类**:描述中提到有一些类库是自己编写的,这可能涉及到面向对象编程中的设计模式,如单例、工厂、观察者等,以及各种实用工具类,如日志记录、缓存管理、数据库操作等。这些自定义类通常遵循一定的命名...