盘点c++几种常见的设计模式及具体实现( 二 )

(3)抽象工厂模式
抽象工厂模式对工厂方法模式进行了更加一般化的描述 。工厂方法模式适用于产品种类结构单一的场合,为一类产品提供创建的接口;而抽象工厂方法适用于产品种类结构多的场合,就是当具有多个抽象产品类型时,抽象工厂便可以派上用场 。
抽象工厂模式更适合实际情况,受生产线所限,让低端工厂生产不同种类的低端产品,高端工厂生产不同种类的高端产品 。
//抽象工厂模式class ProductA{public:virtual void Show() = 0;};class ProductA1 : public ProductA//A类低端产品{public:void Show(){cout<<"I'm ProductA1"<<endl;}};class ProductA2 : public ProductA//A类高端产品{public:void Show(){cout<<"I'm ProductA2"<<endl;}};class ProductB{public:virtual void Show() = 0;};class ProductB1 : public ProductB//B类低端产品{public:void Show(){cout<<"I'm ProductB1"<<endl;}};class ProductB2 : public ProductB//B类高端产品{public:void Show(){cout<<"I'm ProductB2"<<endl;}};class Factory{public:virtual ProductA *CreateProductA() = 0;virtual ProductB *CreateProductB() = 0;};class Factory1 : public Factory//1号工厂用于生产低端产品{public:ProductA *CreateProductA(){return new ProductA1();}ProductB *CreateProductB(){return new ProductB1();}};class Factory2 : public Factory//2号工厂用于生产高端产品{ProductA *CreateProductA(){return new ProductA2();}ProductB *CreateProductB(){return new ProductB2();}};int main(){Factory *factory1 = new Factory1();ProductA *productA1 = factory1->CreateProductA();ProductB *productB1 = factory1->CreateProductB();productA1->Show();productB1->Show();Factory *factory2 = new Factory2();ProductA *productA2 = factory2->CreateProductA();ProductB *productB2 = factory2->CreateProductB();productA2->Show();productB2->Show();if (factory1){delete factory1;factory1 = NULL;}if (productA1){delete productA1;productA1= NULL;}if (productB1){delete productB1;productB1 = NULL;}if (factory2){delete factory2;factory2 = NULL;}if (productA2){delete productA2;productA2 = NULL;}if (productB2){delete productB2;productB2 = NULL;}}3 策略模式策略模式也是一种非常常用的设计模式,而且也不复杂 。下面我们就来看看这种模式 。
定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换 。策略模式让算法独立于使用它的客户而独立变化 。
角色:
抽象策略角色(Strategy): 抽象策略类 。
具体策略角色(ConcreteStrategy):封装了继续相关的算法和行为 。
环境角色(Context):持有一个策略类的引用,最终给客户端调用 。
UML图:

盘点c++几种常见的设计模式及具体实现

文章插图
 
事例: (该事例改编自一道网络设计模式面试题)
如现在你是一个设计师,你正在设计一种空调 。但是你们的空调要支持3种模式 。冷风模式(ColdWind), 热风模式(WramWind),无风模式(NoWind) 。
当选择ColdWind模式,将输送冷风;当选择WarmWind模式,将输送热风;在选择NoWind模式时,空调什么都不做 。你将考虑如何为空调设计应用程序?如果将来空调需要增加支持新的模式呢?
这道面试题,其实可以用各种模式实现,然而在这里我理解策略模式比较合适 。我们将冷风模式,和热风模式以及无风模式可以理解为各种不同的算法 。显然策略模式非常符合 。
这里ColdWind, WramWind, NoWind 其实就是ConcreteStrategy 。IWnd 是抽象策略类 。所以我们开始这么封装我们策略类
#include <IOStream>using namespace std;#definefree_ptr(p)if(p) delete p; p = NULL; class IWind{public: virtual ~IWind(){}; virtual void blowWind() = 0;}; class ColdWind : public IWind{public: void blowWind(){cout<<"Blowing cold wind!"<<endl; };}; class WarmWind : public IWind{public: void blowWind(){cout<<"Blowing warm wind!"<<endl; }}; class NoWind : public IWind{public: void blowWind(){cout<<"No Wind!"<<endl; }};然后我们实现一个windmode 的类,作为 wind 系列的环境类:
class WindMode{public: WindMode(IWind* wind): m_wind(wind){}; ~WindMode(){free_ptr(m_wind);} void blowWind(){m_wind->blowWind(); };private: IWind* m_wind;};最后客户端代码:
int main(int argc, char* argv[]){ WindMode* warmWind = new WindMode(new WarmWind()); WindMode* coldWind = new WindMode(new ColdWind()); WindMode* noWind = new WindMode(new NoWind());warmWind->BlowWind(); coldWind->BlowWind(); noWind->BlowWind();free_ptr(warmWind); free_ptr(coldWind); free_ptr(noWind); system("pause"); return 0;}


推荐阅读