您的位置:首页 > 其它

单例模式

2016-04-18 18:22 141 查看
1. 要求一个类只能生成一个对象,所有对象对它的依赖都是相同的,因为只有一个对象。

2. 通过定义一个私有访问权限的构造函数,避免被其他类new出来一个对象, 而Emperor自己则可以new一个对象出来, 其他类对该类的访问都可以通过getInstance获得同一个对象。

public class Emperor {
private static final Emperor emperor =new Emperor(); //初始化一个皇帝
private Emperor(){
//世俗和道德约束你, 目的就是不希望产生第二个皇帝
}
public static Emperor getInstance(){
return emperor;
}//皇帝发话了
public static void say(){
System.out.println("我就是皇帝某某某....");
}
}


3.单例模式通用代码


public class Singleton {
private static final Singleton singleton = new Singleton();
//限制产生多个对象
private Singleton(){

}/
/通过该方法获得实例对象
public static Singleton getSingleton(){
return singleton;
}
//类中其他方法, 尽量是static
public static void doSomething(){

}
}



4.单例模式的优点

(1)由于单例模式在内存中只有一个实例, 减少了内存开支, 特别是一个对象需要频繁地创建、 销毁时, 而且创建或销毁时性能又无法优化, 单例模式的优势就非常明显。

(2)由于单例模式只生成一个实例, 所以减少了系统的性能开销, 当一个对象的产生需要比较多的资源时, 如读取配置、 产生其他依赖对象时,

则可以通过在应用启动时直接产生一个单例对象, 然后用永久驻留内存的方式来解决( 在Java EE中采用单例模式时需要注意JVM垃圾回收机制).

(3)单例模式可以避免对资源的多重占用, 例如一个写文件动作, 由于只有一个实例存在

内存中, 避免对同一个资源文件的同时写操作。

(4)单例模式可以在系统设置全局的访问点, 优化和共享资源访问, 例如可以设计一个单

例类, 负责所有数据表的映射处理

5.单例模式的缺点

(1)单例模式一般没有接口, 扩展很困难, 若要扩展, 除了修改代码基本上没有第二种途

径可以实现。 单例模式为什么不能增加接口呢? 因为接口对单例模式是没有任何意义的, 它

要求“自行实例化”, 并且提供单一实例、 接口或抽象类是不可能被实例化的。 当然, 在特殊

情况下, 单例模式可以实现接口、 被继承等, 需要在系统开发中根据环境判断。

(2)单例模式对测试是不利的。 在并行开发环境中, 如果单例模式没有完成, 是不能进行

测试的, 没有接口也不能使用mock的方式虚拟一个对象。

(3)单例模式与单一职责原则有冲突。 一个类应该只实现一个逻辑, 而不关心它是否是单

例的, 是不是要单例取决于环境, 单例模式把“要单例”和业务逻辑融合在一个类中

6.单例模式的使用场景

在一个系统中, 要求一个类有且仅有一个对象, 如果出现多个对象就会出现“不良反

应”, 可以采用单例模式, 具体的场景如下:

(1) 要求生成唯一序列号的环境;

(2) 在整个项目中需要一个共享访问点或共享数据, 例如一个Web页面上的计数器, 可以

不用把每次刷新都记录到数据库中, 使用单例模式保持计数器的值, 并确保是线程安全的;

(3) 创建一个对象需要消耗的资源过多, 如要访问IO和数据库等资源;

(4) 需要定义大量的静态常量和静态方法( 如工具类) 的环境, 可以采用单例模式( 当

然, 也可以直接声明为static的方式)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: