作者 firedragonpzy    地址:http://www.firedragonpzy.com.cn/index.php/archives/2103

想必读者一看这个题目又要纳闷了,神马又是“管理者模式”啊?
管理者(Manager)就是专门负责管理其它类的实例的类,比如Cocoa里面的NSFontManager、NSInputManager、NSFileManager和NSLayoutManager类。此模式和“二段构建模式”一样,也没有出现在GoF的23个设计模式中,但是《Cocoa设计模式》一书中有提及,感兴趣的读者可以去查阅一下。

1.应用场景:
     在cocos2d-x里面有大量的应用,比如之前在介绍单例模式中提到的CCTextureCache, CCSpriteFrameCache, CCAnimationCache和CCShaderCache类。
这些管理者一般被设计成单例类。

为什么管理者类要设计成单例呢?因为管理者一般会采用key-value的形式来管理其它类的实例,每当需要获取一个管理者中的实例时,只需要提供一个惟一的键值字符串就可以得到一个与之对应的惟一实例。如果允许存在多个管理者实例的话,那么每个管理者都会维护各自的key-value pairs。这样显然就不能通过键值字符串来获得惟一对象实例了。

CCSpriteFrameCache类通过定制的plist文件来实例化一系列相关的CCSpriteFrame实例,然后只需要提供精灵帧的名字就可以得到相应的CCSpriteFrame实例了。从这个意义上来说,CCSpriteFrameCache类也可以说是一个工厂类,专门负责生产CCSpriteFrame实例。同时,如果精灵帧名字相同的话,那么获取的精灵帧实例也是相同的。

2.使用管理者模式的优缺点。
     优点:为一组相关的对象提供一个统一的全局访问点,同时可以提供一些简洁的接口来获取和操作这些对象。同时,使用此模式来缓存游戏中的常用资源,可以提高游戏运行时性能。

缺点:由于管理者大多采用单例模式,所以,它继承了单例模式所有的缺点,这里就不再赘述了。

3.管理者模式的定义
     管理者类(cache类)可以简化一些可以重用的资源(比如字体、纹理、精灵帧等)的创建和管理工作。管理者模式其实是个混合模式,它综合了单例模式、外观模式和工厂模式。该模式在游戏开发中比较常见,很多需要提升游戏运行性能的场合都运用了此模式。
    此模式的动机:提供一个统一的接口来管理一组相关对象的实例化和访问。
它的一般实现如下:

class TestManager{
public:
static TestManager *sharedTestManager(){
if (NULL == m_psManager) {
m_psManager = new TestManager;
instanceTable = CCDictionary::create();
instanceTable->retain();
}
return m_psManager;
}
void purge(){
CC_SAFE_DELETE(m_psManager);
CC_SAFE_RELEASE_NULL(instanceTable);
}
void registeInstance(const string& key,CCObject *obj){
instanceTable->setObject(ojb,key);
}
CCObject* getInstance(const string& key){
return instanceTable->objectForKey(key);
}
private:
static TestManager* m_psManager;
CCDictionary *instanceTable; //用来管理其它类的一组实例
};

引申:但凡那些对象,在运行时创建的时间开销特别大时,而又要经常重复使用时,都可以采取此模式来提高运行时性能。

5.此模式经常与单例模式配合使用,它的一些设计思想也掺合了外观模式和工厂模式。

摘自:http://www.zilongshanren.com/cocos2d-x-design-pattern-3-managers/

欢迎关注关东升新浪微博@tony_关东升。

关注智捷课堂微信公共平台,了解最新技术文章、图书、教程信息

更多精品iOS、Cocos、移动设计课程请关注智捷课堂官方网站:http://www.zhijieketang.com

智捷课堂论坛网站:http://51work6.com/forum.php

cocos2d-x设计模式发掘之三:管理者模式的更多相关文章

  1. Java进阶篇设计模式之三 ----- 建造者模式和原型模式

    前言 在上一篇中我们学习了工厂模式,介绍了简单工厂模式.工厂方法和抽象工厂模式.本篇则介绍设计模式中属于创建型模式的建造者模式和原型模式. 建造者模式 简介 建造者模式是属于创建型模式.建造者模式使用 ...

  2. Java设计模式之三 ----- 建造者模式和原型模式

    前言 在上一篇中我们学习了工厂模式,介绍了简单工厂模式.工厂方法和抽象工厂模式.本篇则介绍设计模式中属于创建型模式的建造者模式和原型模式. 建造者模式 简介 建造者模式是属于创建型模式.建造者模式使用 ...

  3. Java设计模式之三建造者模式和原型模式

    建造者模式 简介 建造者模式是属于创建型模式.建造者模式使用多个简单的对象一步一步构建成一个复杂的对象.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式.简单的来说就是将一个复杂的东西 ...

  4. java设计模式之Proxy(代理模式)

    java设计模式之Proxy(代理模式) 2008-03-25 20:30 227人阅读 评论(0) 收藏 举报 设计模式javaauthorizationpermissionsstringclass ...

  5. php设计模式之职责链模式

    <?php /** * @desc php设计模式之职责链模式(责任链模式) 定义:顾名思义,责任链模式为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这 ...

  6. php设计模式之责任链模式

    php设计模式之责任链模式 实际问题 你的论坛有举报功能,版主能解决粗口方面的举报,警察能解决严重一点的黄赌毒方面的举报,更严重的反政府的举报就需要由国安局来完成. 职场中每个人都有直属的上级,如果到 ...

  7. 重学 Java 设计模式:实战备忘录模式「模拟互联网系统上线过程中,配置文件回滚场景」

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 实现不了是研发的借口? 实现不了,有时候是功能复杂度较高难以实 ...

  8. C#设计模式(3)——工厂方法模式

    一.概念:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 二.代码实现 namespace 设计模式之工厂方法模式 { /// <summary&g ...

  9. Java 设计模式泛谈&装饰者模式和单例模式

    设计模式(Design Pattern) 1.是一套被反复使用.多人知晓的,经过分类编目 的 代码设计经验总结.使用设计模式是为了可重用代码,让代码更容易维护以及扩展. 2.简单的讲:所谓模式就是得到 ...

随机推荐

  1. Django——Django中的QuerySet API 与ORM(对象关系映射)

    首先名词解释. ORM: 对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型 ...

  2. RSA的密钥把JAVA格式转换成C#的格式(2)

    把C#格式转换成Java:RSA的密钥把JAVA格式转换成C#的格式(1) 我已经在第一篇介绍过如何把C#格式转换成Java,现在来看看如何把Java格式转换成C#. /// <summary& ...

  3. Srping AOP xml方式

      使用aop需要: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="ht ...

  4. poj 3696 The Luckiest number 欧拉函数在解a^x=1modm的应用

    题意: 给一个L,求长度最小的全8数满足该数是L的倍数. 分析: 转化为求方程a^x==1modm. 之后就是各种数学论证了. 代码: //poj 3696 //sep9 #include <i ...

  5. 解决安装Ubuntu之后找不到无线网卡驱动的问题

    为了不浇灭大家尝试ubuntu的冲动,昨天我安装了ubuntu 14.04 LTS版本号,从安装到又一次开机都非常顺利.PS:不会安装的请找教程区把,网上非常多,CSDN论坛都有. 安装之后当你奇妙的 ...

  6. 分布式计算中WebService的替代方案: RPC (XML-RPC | JSON-RPC)

    XML-RPC http://zh.wikipedia.org/wiki/XML-RPC XML-RPC是一个远程过程调用(远端程序呼叫)(remote procedure call,RPC)的分布式 ...

  7. 自定义 Collection View 布局

    自定义 Collection View 布局 answer-huang 29 Mar 2014 分享文章 UICollectionView 在 iOS6 中第一次被引入,也是 UIKit 视图类中的一 ...

  8. 查看文件内容- 删除某个运行程序的所有进程-nohup后台执行程序

    1 查看文件内容: tail -f test.txt 2 查看端口 netstat nlp 3 删除某个运行程序的所有进程 ps -ef|grep translateService.py|grep - ...

  9. form表单提交方式

    form表单提交方式总结一下: 一.利用submit按钮实现提交,当点击submit按钮时,触发onclick事件,由JavaScript里函数判断输入内容是否为空,如果为空,返回false, 不提交 ...

  10. python 类成员的修饰符

    类的所有成员在上一步骤中已经做了详细的介绍,对于每一个类的成员而言都有两种形式: 公有成员,在任何地方都能访问 私有成员,只有在类的内部才能方法 私有成员和公有成员的定义不同:私有成员命名时,前两个字 ...