COCOS设计模式--简单工厂模式

来源:互联网 发布:网络招人平台有哪些 编辑:程序博客网 时间:2024/05/21 10:33


Cocos2d-x中也有工厂模式,何为工厂模式,顾名思义就是用来产生产品的,工厂就是用来创建其他类对象的类,我们把这个创建其他类对象的类叫做工厂类,而这些被创建的对象叫做产品,所以这种模式才叫做工厂模式,是不是很形象。我们从纯C++的角度来看一下如何使用工厂模式。工厂模式又分为简单工厂模式、工厂方法模式、抽象工厂模式,先来看一下简单工厂模式如何实现。

简单工厂模式:

为了解决频繁调用头文件的问题。

当在程序中创建对象的时候少不了new,有时候new会很多,又分布在程序的不同地方,管理起来很不方便,这个时候需要一个工厂类,专门负责对象的创建和释放,将对象的这种操作统一在一起,同时工厂类向外部提供了创建对象的接口,而对对象的使用则和这个工厂类毫无关系。

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#ifndef _FACTORY_H_
#define _FACTORY_H_
#include <iostream>
 
usingnamespacestd;
 
enumProductType
{
typeA,
typeB
};
 
//产品类的基类
classProduct
{
public:
//存虚函数
virtualvoidshow()=0;
};
 
classProductA : publicProduct
{
public:
voidshow()
{
cout<<"ProductA\n";
};
};
 
classProductB : publicProduct
{
public:
voidshow()
{
cout<<"ProductB\n";
};
};
 
//工厂类,用来产生产品
classFactory
{
public:
//根据传入的不同产品类型产生不同的对象
Product * createProduct(ProductType type)
{
switch(type)
{
casetypeA:
returnnewProductA();
casetypeB:
returnnewProductB();
default:
returnNULL;
}
};
};
 
#endif
#include "Factory.h"
 
intmain()
{
Factory * factory = newFactory();
//产生产品
ProductA * pa = (ProductA *)factory->createProduct(typeA);
pa->show();
 
ProductB * pb = (ProductB *)factory->createProduct(typeB);
pb->show();
 
//记得析构
deletefactory;
//产品的析构可以放到factory类的析构函数中去做
deletepa;
deletepb;
 
return0;
}


工厂方法模式:是为了解决简单工厂模式的弊端存在的,简单工厂模式的扩展性不好,比如我们有了第三个产品ProductC,我们需要工厂为我们产生这个对象,怎么办,需要修改工厂类中的创建对象的函数,也就是switch结构,还有就是枚举处也要进行修改,而这种修改会带来不少的弊端,所以我们就有了工厂方法模式。这个模式将Factory设计为抽象类,其中包含子类必须实现的方法,而对产品的具体创建则放到Factory的子类中去完成。这个时候如果有一个产品C,我们就创建一个工厂类FactoryC,专门用来产生产品C,就不需要改动其他地方的代码了。

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#ifndef _FACTORY_H_
#define _FACTORY_H_
#include <iostream>
 
usingnamespacestd;
 
//产品类的基类
classProduct
{
public:
//存虚函数
virtualvoidshow()=0;
};
 
classProductA : publicProduct
{
public:
voidshow()
{
cout<<"ProductA\n";
};
};
 
classProductB : publicProduct
{
public:
voidshow()
{
cout<<"ProductB\n";
};
};
 
//工厂抽象类,定义子类必须实现的接口
classFactory
{
public:
//根据传入的不同产品类型产生不同的对象
virtualProduct * createProduct()=0;
};
 
//具体的工厂类,用来产生不同的产品
classFactoryA : publicFactory
{
public:
Product * createProduct()
{
returnnewProductA();
};
};
 
classFactoryB : publicFactory
{
public:
Product * createProduct()
{
returnnewProductB();
};
};
 
#endif
 
 
#include "Factory.h"
 
intmain()
{
//产生产品
FactoryA * factoryA = newFactoryA();
Product * pa = factoryA->createProduct();
pa->show();
 
FactoryB * factoryB = newFactoryB();
Product * pb = factoryB->createProduct();
pb->show();
 
//记得析构
deletefactoryA;
deletefactoryB;
//产品的析构可以放到factory类的析构函数中去做
deletepa;
deletepb;
 
return0;
}



抽象工厂模式:现在我们的产品类都是继承自Product的,如果有一个产品不是Product的子类怎么办呢?这个时候就用到了抽象工厂模式,这个模式是工厂方法模式的叠加,其他的东西类似,看下代码就清楚了。 

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#ifndef _FACTORY_H_
#define _FACTORY_H_
#include <iostream>
 
usingnamespacestd;
 
//产品类A类的基类
classProductA
{
public:
//存虚函数
virtualvoidshow()=0;
};
 
classProductA1 : publicProductA
{
public:
voidshow()
{
cout<<"ProductA1\n";
};
};
 
classProductA2 : publicProductA
{
public:
voidshow()
{
cout<<"ProductA2\n";
};
};
 
//产品类B类的基类
classProductB
{
virtualvoidshow()=0;
};
 
classProductB1 : publicProductB
{
voidshow()
{
cout<<"ProductB1\n";
};
};
 
classProductB2 : publicProductB
{
voidshow()
{
cout<<"ProductB2\n";
};
};
 
//工厂抽象类,定义子类必须实现的接口
classFactory
{
public:
//根据传入的不同产品类型产生不同的对象
virtualProductA * createProductA()=0;
virtualProductB * createProductB()=0;
};
 
//具体的工厂类,用来产生不同的产品
classFactoryA : publicFactory
{
public:
ProductA * createProductA()
{
returnnewProductA1();
};
ProductB * createProductB()
{
returnnewProductB1();
};
};
 
classFactoryB : publicFactory
{
public:
ProductA * createProductA()
{
returnnewProductA2();
};
ProductB * createProductB()
{
returnnewProductB2();
};
};
 
#endif
以上是对工厂模式的说明,下面看看工厂模式在Cocos2d-x中的应用,引用Cocos2d-x高级开发教程一书中的话:“工厂方法是程序设计中一个经典的设计模式,指的是基类中只定义创建对象的接口,将实际的实现推迟到子类中。在这里,我们将它稍加推广,泛指一切生成并返回一个对象的静态函数”。 

一切生成并返回一个对象的静态函数就是一个工厂方法,这样的话,Cocos2d-x中是不是有很多这样的方法?比如创建场景的createScene函数,创建多数对象的create函数,一个经典的工厂方法如同这样:  

1
2
3
4
5
6
7
Sprite* factoryMethod()
 {
Sprite* ret = newSprite();
//在这里对 ret 对象进行必要的初始化操作
ret->autorelease();
returnret;
 }
在我们自己的程序中使用工厂模式的应用场景可以是这样:我们要创建很多的子弹,如果使用Sprite的create方法每次都会分配内存,子弹销毁的时候释放内存,这样的创建方法效率不高,如果我们使用工厂方法来完成这件事情,自己的工厂方法立面维护一个容器,容器里存放被销毁的子弹,需要新的子弹的时候,从容器中拿出来。根据子弹的类型,更换纹理,重置位置,重置飞行速度和方向,然后发射出去。如果容器中没有被销毁的子弹,就初始化一个,这样的话就不用每次new、delete了,内存中的子弹数量是一定的,可以提高程序的效率。 
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 淘宝显示签收但是我没收到货怎么办 淘宝东西没收到显示签收了怎么办 开拼多多店铺的密码忘了怎么办 拼多多密码跟店铺名忘了怎么办 闲鱼上卖出的宝贝被调包了怎么办 上传身份证照片说格式错误该怎么办 我给厂里打的款不给发货怎么办 净值接近不定期份额折算阀值怎么办 有锁电信4g掉了怎么办 在电脑中找不到想作废的发票怎么办 科目三补考费发票丢了怎么办 母婴店飞鹤奶粉突然厂家撤货怎么办 澳门买的保健品感觉是假的怎么办 淘宝买东西提交需求时卡死了怎么办 天猫精灵显示为离线状态怎么办 退货多被淘宝店铺拉入黑名单怎么办 天猫订单3天不发货怎么办 新开的厨卫店越来越没生意怎么办 淘宝积分不够领不到购物津贴怎么办 穿越火线精英集结号积分不足怎么办 天猫购物津贴领多了怎么办 车贷逾期车被开走还不清全款怎么办 孩子特别懒不爱动又胖怎么办 微信的聊天记录被限制了怎么办 门面租金交了一年对方不租了怎么办 离职后社保怎么办 无忧保专业可靠 淘宝店铺被投诉到监管局怎么办 淘宝买家每天都来店铺骚扰怎么办 电脑安装软件时解压出现问题怎么办 公婆不尊重你的父母做媳妇的怎么办 手机扣扣接收不上文件怎么办 买了商铺付了首付商铺倒闭了怎么办 宝宝刚满月不喜欢在床上睡怎么办 别人给我打了收货款不发货怎么办 业务员私收货款公司不发货怎么办 付款后商家没发货也不退钱怎么办 苹果7P修过主板耗电严重怎么办 oppo手机进水了开不了机怎么办 手机弯了变形但不影响使用怎么办 拼多多留错电话怎么办如果已经发货 苹果6手机后壳变形了怎么办