您的位置:首页 > 编程语言 > C语言/C++

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

2017-12-13 08:38 274 查看
设计程序经常会有这种需求 , 某个类里的方法能够全局访问. 在这种情况下有两种实现方案 :

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++语言