工厂模式

现在的网游更新很快,要延长网络游戏生命周期的方法是,更新,不断地更新,不断的将新内容呈现于玩家面前。这要求游戏程序的设计要有弹性,代码的重用至关重要。

使用工厂模式,把对象的创建和使用的过程分开,降低代码重复。因为工厂管理了对象的创建逻辑,使用者并不需要知道具体的创建过程,只管使用即可,减少了使用者因为创建逻辑导致的错误。

今天就说说游戏中的工厂模式。说到工厂模式,有简单工厂模式,工厂方法模式,抽象工厂模式。

简单工厂模式

简单工厂模式主要用于创建对象。新添加类时,不会影响以前的系统代码。核心思想是用一个工厂来根据输入的条件产生不同的类,然后根据不同类的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.