C++ 常用设计模式之 简单工厂模式
本文封面来自网络
文字小K
很多人应该听说过设计模式(Design pattern),但是在实际工作或者学习过程中,很多时候会有点不知所措的感觉。这主要是对设计模式的理解不够深入。那么什么是设计模式呢?
设计模式是一套代码设计经验的总结,项目中合理的使用设计模式可以轻松巧妙的解决很多问题,使代码整洁凝练。提倡使用并不是滥用,或者强迫去用,它是在对设计模式有了深入理解后自然的过渡。曾经一个朋友去去某公司面试,结果在家庭作业阶段,将20多种设计模式都用进去了,想着是加分。结果公司给出的结论是过于卖弄,强行使用。 就例如你要写一个“Hello world” 也要用个设计模式,这就有点过了。
废话不多说,这次我们先从一个简单模式开始:
首先看看什么是简单工厂模式:
简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
简单工厂模式属于创建型模式又叫做静态工厂方法模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。
让我们以暴雪的一款经典即时战略游戏星际争霸来举个例子, 神族的空间站能造很多的飞行器,如海盗船、航母、仲裁者、侦察机等等飞行器。我们用一个工程类来模拟空间站。下面看一下代码:
using namespace std;typedef enum {Scout_type, //侦察机Carrier_type, //航母Corsair_type, //海盗船Arbiter_type //仲裁者}SHIP_TYPE;class Aerocraft{protected:int speed; //飞行速度int size;//船舰尺寸public:virtual void show() = 0; //显示飞行器名称virtual ~Aerocraft(){};void setSpeed(int spd){speed = spd;}void setSize(int sz){size = sz;}};
我们用枚举来定义船舰的类型,一个抽象类Aerocraft飞行器类,里面两个成
员speed 和 size。
一个纯虚函数show 要求子类实现具体功能。
class Scout :public Aerocraft{public:void show(){cout <<"This is a scout:speed "<<speed<<" ship size:"<<size<<endl;}Scout(){cout<<"init scout" <<endl;}~Scout(){cout<<"dealloc scout"<<endl;}};class Carrier :public Aerocraft{public:void show(){cout <<"This is a Carrier:speed "<<speed<<" ship size:"<<size<<endl;}Carrier(){cout<<"init Carrier" <<endl;}~Carrier(){cout<<"dealloc Carrier"<<endl;}};class Corsair :public Aerocraft{public:void show(){cout <<"This is a Corsair:speed "<<speed<<" ship size:"<<size<<endl;}Corsair(){cout<<"init Corsair" <<endl;}~Corsair(){cout<<"dealloc Corsair"<<endl;}};class Arbiter :public Aerocraft{public:void show(){cout <<"This is a Arbiter:speed "<<speed<<" ship size:"<<size<<endl;}Arbiter(){cout<<"init Arbiter" <<endl;}~Arbiter(){cout<<"dealloc Arbiter"<<endl;}};
接下来分别创建了,航母、海盗船、侦察机和仲裁者四个类继承飞行器类。
这时候我们还需要一个空间站就能生产船舰了。
class AerocraftFactory{public:Aerocraft* createAerocraft(SHIP_TYPE type){switch (type){case Scout_type:{Scout *scout = new Scout();scout->setSize(1);scout->setSpeed(20);return scout;}case Carrier_type:{Carrier* carrier = new Carrier();carrier->setSpeed(5);carrier->setSize(10);return carrier;}case Corsair_type:{Corsair *corsair = new Corsair();corsair->setSize(2);corsair->setSpeed(18);return corsair;}case Arbiter_type:{Arbiter *arbiter = new Arbiter();arbiter->setSpeed(8);arbiter->setSize(10);return arbiter;}default:return NULL;break;}}};
所有的船舰的创建都在工厂中实现,方便后期扩展。
int main(){AerocraftFactory *factory = new AerocraftFactory();Aerocraft *ship1 = factory->createAerocraft(Scout_type);Aerocraft *ship2 = factory->createAerocraft(Carrier_type);Aerocraft *ship3 = factory->createAerocraft(Corsair_type);Aerocraft *ship4 = factory->createAerocraft(Arbiter_type);ship1->show();ship2->show();ship3->show();ship4->show();return 0;}
让我们在主函数中生产吧。看下控制台输出。
This is a scout:speed 20 ship size:1
This is a Carrier:speed 5 ship size:10
This is a Corsair:speed 18 ship size:2
This is a Arbiter:speed 8 ship size:10
完美解决。
