C++

作者:haroel
链接:https://www.zhihu.com/question/56527586/answer/149837964
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

理论有时学起来很枯燥,所以说2个例子。

1. 继承。

cocos2d-x游戏引擎的FileUtils来做个说明,游戏业务功能层面我们只用调用 FileUtils类的静态 getInstance方法,FileUtils::getInstance()->func() 。。。 就可以调用需要的资源。

FileUtils类实现了许多通用的处理方法,它是一个单例,FileUtils.h里面声明了 static FileUtils* getInstance();FileUtils.cpp里没有getInstance实现代码(FileUtils可以看成抽象类)。

getInstance的实现是放在不同平台的FileUtils子类,比如FileUtils-AppleFileUtils-AndroidFileUtils-win32(当然你也可以继续继承FileUtils-Apple等等来实现更多功能),这几个类都继承了FileUtils,并实现了static FileUtils* getInstance()。 用这种方式,增加一个新平台可以完全不用修改已有的代码,代码结构组织也非常清晰。 当然,如果全部静态+宏也能实现,不过代码维护性可能惨不忍睹。

github: cocos2d/cocos2d-x

2. 多核实现。

单例模式的目的是为了创建一个唯一的全局对象。

抽象点的比喻,某地有一个工厂A1B公司是工厂的管理机构,在实现上,A1的系统里有一个单例类A1来统筹管理其生产业务流程。现在要扩大生产规模,在另外一个地方新建一家工厂A2,两家业务相似但不完全相同,现在B要同时管理A1A2

这里A1A2构成了2个模块,每个模块内部独立,互不干涉,大概代码是这样,应该看得懂


<img src="https://pic1.zhimg.com/50/v2-79b85e7e58093172197a84e12efcd655_hd.jpg" data-rawwidth="892" data-rawheight="1014" class="origin_image zh-lightbox-thumb" width="892" data-original="https://pic1.zhimg.com/v2-79b85e7e58093172197a84e12efcd655_r.jpg">

A2A1类似,这里不详细写了,AgetInstance需要传一个参数。 用这种方式,A1A2依然是全局唯一,B公司系统在调用时依然只需要使用A::getInstance("Ai"),就可以控制任何一个子工厂的生产。同样的,如果未来再建立新模块或者删除已有模块代码,B公司系统可不做修改就能满足需求。

(如果还不理解,建议去了解下pureMVC的多核原理)

 

我总结出来大概就这两种。相比而言,用类比用静态来实现单例更加合理,结构和扩展性也相比较好。当然,如果你的系统非常小,就是一快餐式的代码,根本不用去考虑扩展和维护,单例随你怎么用了,根本没有什么非要用实例化来实现单例的说法。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章