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
完美解决。