现在的网游更新很快,要延长网络游戏生命周期的方法是,更新,不断地更新,不断的将新内容呈现于玩家面前。这要求游戏程序的设计要有弹性,代码的重用至关重要。
使用工厂模式,把对象的创建和使用的过程分开,降低代码重复。因为工厂管理了对象的创建逻辑,使用者并不需要知道具体的创建过程,只管使用即可,减少了使用者因为创建逻辑导致的错误。
今天就说说游戏中的工厂模式。说到工厂模式,有简单工厂模式,工厂方法模式,抽象工厂模式。
简单工厂模式
简单工厂模式主要用于创建对象。新添加类时,不会影响以前的系统代码。核心思想是用一个工厂来根据输入的条件产生不同的类,然后根据不同类的virtual函数得到不同的结果。
面向对象的编程,并不是类越多越好,类的划分是为了封装,但分类的基础是抽象,具有相同属性和功能的对象的抽象集合才是类。
工厂类与基类为关联关系:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| class COperation { public: virtual double GetResult() { cout<<"基类"<<endl; } };
class AddOperation : public COperation { public: virtual double GetResult() { cout<<"加法"<<endl; } };
class CCalculatorFactory { public: static COperation* Create(char cOperator); };
COperation* CCalculatorFactory::Create(char cOperator) { COperation *oper; switch (cOperator) { case '+': oper=new AddOperation(); break; default: oper=new AddOperation(); break; } return oper; }
|
使用者:
1 2
| COperation * op=CCalculatorFactory::Create('+'); cout<<op->GetResult()<<endl;
|
优:适用于不同情况创建不同的类时
劣:使用者必须要知道基类和工厂类,耦合性差
工厂方法模式
简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| class LeiFeng { public: virtual void Sweep() { cout<<"雷锋扫地"<<endl; } };
class Volenter: public LeiFeng { public : virtual void Sweep() { cout<<"志愿者"<<endl; } };
class LeiFengFactory { public: virtual LeiFeng* CreateLeiFeng() { return new LeiFeng(); } };
class VolenterFactory : public LeiFengFactory { public: virtual LeiFeng* CreateLeiFeng() { return new Volenter(); } };
|
使用者:
1 2 3
| VolenterFactory*sf = new VolenterFactory(); Volenter *s = sf->CreateLeiFeng(); s->Sweep();
|
优:修正了简单工厂模式中不遵守开放-封闭原则。工厂方法模式把选择判断移到了使用者去实现,如果想添加新功能就不用修改原来的类,直接修改使用者实现即可
劣:但简单工厂模式中不遵守开放-封闭原则。代码耦合性差
抽象工厂模式
提供一个创建一系列相关或相互依赖的接口,而无需指定它们的具体类。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| class IUser { public : virtual void GetUser()=0; virtual void InsertUser()=0; };
class CSqlUser : public IUser { public: virtual void GetUser() { cout<<"Sql User"<<endl; } virtual void InsertUser() { cout<<"Sql User"<<endl; } };
class IFactory { public: virtual IUser* CreateUser()=0; };
class SqlFactory : public IFactory { public: virtual IUser* CreateUser() { return new CSqlUser(); } };
|
使用者:
1 2 3
| IFactory* factory= new SqlFactory(); IUser* user=factory->CreateUser(); user->GetUser();
|
Nunca es tarde para aprender.