C++静态成员和非静态成员的区别

设计程序经常会有这种需求 , 某个类里的方法能够全局访问. 在这种情况下有两种实现方案 :
1>单例模式(Singleton);
2>静态方法.

比较两种方式:
1>什么时候使用静态类代替singleton :
这里有几个很好的静态类比singleton更好的应用场景. 最基本的例子就是在Java中的java.lang.Math类的实现方式, Math类就是用过静态方法来实现的,而不是单例来实现的.
总结 :
如果你的singleton**不提维持任何状态, 仅仅是提供全局的访问** , 这个时候就适合用静态类 , 这样速度也更快, 因为static bind在编译期间(compile during) . 记住不经意维持子类的状态 , 尤其是在并发的情况下, 多个线程并发修改,这容易导致不容易发现的race condition 关于race condition .

静态类适用于一些工具类 , 其他的如单个访问资源就可以用singleton.
2>静态类和singleton之间的区别 :
static类有更好的访问效率(Static class provides better performance than Singleton pattern, because static methods are bonded on compile time)
singleton比static class更容易测试. 那个容易模拟(mock), 哪个就容易测试. singleton很容易用JUnit测试, 因为你能够传递mock对象, 当singleton需要的时候(作为方法参数或者构造函数参数),
④ 如果你的需求是维护(maintain)状态, 那么singleton比static class更好 , 如果使用static class会出现一些问题.
singleton支持延迟加载 , 而static class 则不支持这样的特性 , 在重量级的对象, 延迟加载就显得非常重要.

延迟加载,可以简单理解为,只有在使用的时候,才会发出sql语句进行查询。
延迟加载的有效期是在session打开的情况下,当session关闭后,会报异常。当调用load方法加载对象时,返回代理对象,等到真正用到对象的内容时才发出sql语句。

⑥ 在一些依赖注入(Dependency injection framework)的框架 , 它能够很好的管理singleton对象 . 例如Spring.

3>singleton相对于静态类的一些高级特点 :
singleton 对于static class 主要的优点是更加面向对象 . 对于singleton你可以使用继承(Inheritance)和多态(polymorphism)来继承一个基类, 实现一个接口, 提供不同功能 的实现. 例如 , Java中java.lang.Runtime ,该类就是一个singleton的, 调用getRuntime(),基于不同的JVM ,返回不同的实现对象, 针对一个一个JVM,确保只有一个Runtime对象 , 如果使用static class就不能很好的来实现这样的功能了 .

欢迎转载 转载请注明出处 : http://blog.csdn.net/johnny901114/article/details/11969015

猜你喜欢

转载自blog.csdn.net/programer_vc/article/details/78787810
今日推荐