深圳莲花大厦住房和建设局网站,做IT的会做网站吗,专教做蛋糕的网站,南昌seo推广外包一、单实例模式
在设计模式中#xff0c;单实例模式几乎是所有语言中都非常常用的一种设计模式。它在实际的应用中也非常广泛#xff0c;在很多的开源框架中#xff0c;都可以看到单实例的影子。单实例#xff0c;简单的就可以看做在整个应用周期中#xff0c;只有一个对…一、单实例模式
在设计模式中单实例模式几乎是所有语言中都非常常用的一种设计模式。它在实际的应用中也非常广泛在很多的开源框架中都可以看到单实例的影子。单实例简单的就可以看做在整个应用周期中只有一个对象的变量。其好处其实就一点可以集中控制对对象的各种处理比如优化、内存管理等等缺点其实就是两个一个是生命周期无法动态控制另外一个就是无法动态伸缩。前者容易理解后者举个简单例子如果想同时连接多个数据库这就不好控制了。
二、静态方法和静态变量
学习C/C语言的对静态变量和静态方法都是很熟悉的。静态化和单实例也有着千丝万缕的关系在实现单实例的发展过程中有很多种方式现在比较常见的基本就是两种一种是使用函数的局部静态变量一种是使用std::call_once,而且这两个都需要从C0x开始支持。 首先说明一点此处不是分析如何实现单实例所以不会对实现的各种方式进行分析说明重点在于单实例与静态化的关系这一点进行深入剖析。为什么单实例中对静态化情有独钟呢可不可以全部使用静态化来实现单实例呢 答案其实反复回答过静态变量可以防止反复检测比如经典的Double Check的性能损失函数的局部静态变量仍然会有一个检测过程性能仍然会有些损失至于能不能使用全部静态化来实现单实例当然是没有问题的。但问题在于使用这种方式会丧失一定的灵活性这个在下面分进行分析。
三、单实例中的静态化
那么单实例中使用静态化操作有什么优势呢 1、线程安全性 熟悉全局和静态变量的开发者都有一个头疼的地方编译器是无法保证多个文件内的相关这样的变量的初始化顺序的。这就出现一个非常难受的问题如果以后扩展需要多个文件或者多个库内的全局或者静态变量需要互相依赖有可能会出一些让人想象不到的问题。有大牛提出过把全局或者静态变量搞到一个文件中可实际场景中算法保密甚至第三方库都使开发者无法达到这样的目的。 而Meyers’ Singleton即Scott Meyers最早提出来的C单例模式的写法其实就是局部静态变量的方式来实现不过在前面也提到了它需要C0x做保证同样在一些编译器上可能也有一些具体的问题但这不是讨论的范畴了。 2、接口继承 如果使用单实例封装使用静态化那么就可以实现继承来延续静态化的应用。这其实是一个非常重要的应用可以继承意味着可扩展性极大的增强,即灵活性的增加。
3、延迟加载 所谓延迟加载其实就是懒汉模式它只会在第一次用到时创建这个对象。这在一些资源要求严格的场景下还是很有用处的。 4、解决了多文件库的互相引用问题 其实这点还是静态变量的初始化顺序导致的问题这个非常重要可能很多人都没遇到过但经验表明一旦出现这个问题简直就是一场灾难因为正常的思维情况下很少考虑这种情况。当你弄明白是这个原因后会陷入无比的自责和自馁中。
5、生命周期 单实例封装静化可以主动控制生命周期这与使用一个单纯的静态或者全局变量有着可控的优势。毕竟全局静态变量一旦生成就是整个进程的生命周期陪伴着这对于一些对资源要求苛刻的场景下还是很在裨益的。
另外单实例的参数传递非常大的应用程序中以及后期对测试的支持都可以做为一种优势来进行说明。但重点是静态化使用与单实例中如何最具有优势这才是开发者需要首先考虑的。
下面给出一个Meyers’ Singleton例子
struct Singleton
{static Singleton instance(){static Singleton s;return s;} // instanceSingleton(const Singleton ) delete;Singleton operator (const Singleton ) delete;private:Singleton() {}~Singleton() {}}; // struct Singleton
struct OwnerSingleton:public Singleton
{};不过一般来说可能对绝大多数程序员来说实际情况中遇到单例继承的情况极为罕见吧。 其实直接使用全局或者静态变量与使用单实例从开发的本质来说区别不大但单实例更好的解决了在上层逻辑上的灵活扩展性这其实就是设计的意义也是设计模式的意义。实现功能可能大家都会可如何做得更好就见仁见智了。
四、总结
到最后总结各种经验其实可以发现在实际的应用场景上使用一些习惯用法或者说设计模式的目的主要是为了扩展性和防御性编程。如果能够明确的知道不会发生或者某些异常会被阻止的情况下不进行使用其实也是没问题的话只能说到这儿大家自己考虑。说这些话的目的就是经验是个好东西但不要陷入经验主义书本是个好东西不要陷入本本主义。实践是检验真理的唯一标准抓住老鼠的一定是好猫。