vlambda博客
学习文章列表

C++ 常用设计模式之 简单工厂模式

本文封面来自网络

文字小K

很多人应该听说过设计模式(Design pattern),但是在实际工作或者学习过程中,很多时候会有点不知所措的感觉。这主要是对设计模式的理解不够深入。那么什么是设计模式呢?

设计模式是一套代码设计经验的总结,项目中合理的使用设计模式可以轻松巧妙的解决很多问题,使代码整洁凝练。提倡使用并不是滥用,或者强迫去用,它是在对设计模式有了深入理解后自然的过渡。曾经一个朋友去去某公司面试,结果在家庭作业阶段,将20多种设计模式都用进去了,想着是加分。结果公司给出的结论是过于卖弄,强行使用。 就例如你要写一个“Hello world” 也要用个设计模式,这就有点过了。

废话不多说,这次我们先从一个简单模式开始:

首先看看什么是简单工厂模式:


简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

简单工厂模式属于创建型模式又叫做静态工厂方法模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。

让我们以暴雪的一款经典即时战略游戏星际争霸来举个例子, 神族的空间站能造很多的飞行器,如海盗船、航母、仲裁者、侦察机等等飞行器。我们用一个工程类来模拟空间站。下面看一下代码:

#include <iostream>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


完美解决。