单例模式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单例模式相关的知识,希望对你有一定的参考价值。
参考技术A 一个类只能有一个实例化对象。经典的实现方式是,创建一个类,这个类包含一个方法,这个方法在没有对象存在的情况下,将会创建一个新的实例对象。如果对象存在,这个方法只是返回这个对象的引用。
js 中并没有类的概念,作为一种非常灵活的语言,我们还可以用闭包的方式去实现:
默认情况下函数的返回值为undefined(即没有显示地定义返回值的话),但是构造函数比较例外,new构造函数在没有return的情况下默认返回新创建的对象。但是在有显示返回值的情况下,如果返回值为基本数据类型的话(string,number,boolean,undefined,null),返回值仍然为新创建的对象,这一点比较奇怪,需要注意。只有在显示返回一个非基本数据类型的对象的时候,函数的返回值才为指定的对象。在这种情况下,this值所引用的对象就被丢弃了。
es6引进类的概念
Java模式设计之单例模式(二)
参考技术A在什么情况下使用单例模式
使用单例模式的条件
使用单例模式有一个很重要的必要条件
在一个系统要求一个类只有一个实例时才应当使用单例模式 反过来说 如果一个类可以有几个实例共存 那么就没有必要使用单例类 但是有经验的读者可能会看到很多不当地使用单例模式的例子 可见做到上面这一点并不容易 下面就是一些这样的情况
例子一
问 我的一个系统需要一些 全程 变量 学习了单例模式后 我发现可以使用一个单例类盛放所有的 全程 变量 请问这样做对吗?
答 这样做是违背单例模式的用意的 单例模式只应当在有真正的 单一实例 的需求时才可使用
一个设计得当的系统不应当有所谓的 全程 变量 这些变量应当放到它们所描述的实体所对应的类中去 将这些变量从它们所描述的实体类中抽出来 放到一个不相干的单例类中去 会使得这些变量产生错误的依赖关系和耦合关系
例子二
问 我的一个系统需要管理与数据库的连接 学习了单例模式后 我发现可以使用一个单例类包装一个Connection 对象 并在finalize()方法中关闭这个Connection 对象 这样的话 在这个单例类的实例没有被人引用时 这个finalize() 对象就会被调用 因此 Connection 对象就会被释放 这多妙啊
答 这样做是不恰当的 除非有单一实例的需求 不然不要使用单例模式 在这里Connection 对象可以同时有几个实例共存 不需要是单一实例
单例模式有很多的错误使用案例都与此例子相似 它们都是试图使用单例模式管理共享资源的生命周期 这是不恰当的
单例类的状态
有状态的单例类
一个单例类可以是有状态的(stateful) 一个有状态的单例对象一般也是可变(mutable) 单例对象
有状态的可变的单例对象常常当做状态库(repositary)使用 比如一个单例对象可以持有一个int 类型的属性 用来给一个系统提供一个数值惟一的序列号码 作为某个贩卖系统的账单号码 当然 一个单例类可以持有一个聚集 从而允许存储多个状态
没有状态的单例类
另一方面 单例类也可以是没有状态的(stateless) 仅用做提供工具性函数的对象 既然是为了提供工具性函数 也就没有必要创建多个实例 因此使用单例模式很合适 一个没有状态的单例类也就是不变(Immutable) 单例类 关于不变模式 读者可以参见本书的 不变(Immutable )模式 一章
多个JVM 系统的分散式系统
EJB 容器有能力将一个EJB 的实例跨过几个JVM 调用 由于单例对象不是EJB 因此 单例类局限于某一个JVM 中 换言之 如果EJB 在跨过JVM 后仍然需要引用同一个单例类的话 这个单例类就会在数个JVM 中被实例化 造成多个单例对象的实例出现 一个J EE应用系统可能分布在数个JVM 中 这时候不一定需要EJB 就能造成多个单例类的实例出现在不同JVM 中的情况
如果这个单例类是没有状态的 那么就没有问题 因为没有状态的对象是没有区别的 但是如果这个单例类是有状态的 那么问题就来了 举例来说 如果一个单例对象可以持有一个int 类型的属性 用来给一个系统提供一个数值惟一的序列号码 作为某个贩卖系统的账单号码的话 用户会看到同一个号码出现好几次
在任何使用了EJB RMI 和JINI 技术的分散式系统中 应当避免使用有状态的单例模式
多个类加载器
同一个JVM 中会有多个类加载器 当两个类加载器同时加载同一个类时 会出现两个实例 在很多J EE 服务器允许同一个服务器内有几个Servlet 引擎时 每一个引擎都有独立的类加载器 经有不同的类加载器加载的对象之间是绝缘的
lishixinzhi/Article/program/Java/gj/201311/27644
以上是关于单例模式的主要内容,如果未能解决你的问题,请参考以下文章