简单工厂模式
我的理解:
假设你需要更换轮胎,你可以选择去一些私人开的小店面;可以去轮胎大卖场;也可以去汽配城。
假设,你优先选择了小型的店面;由于店面空间有限所有品牌的轮胎都放在唯一的一个柜台里面。这种情况和我们的简单工厂模式很类似。
流程:
用户代表了客户端的行为,所以逻辑如下:
(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(); }
运行结果