您的位置:首页 > 编程语言 > Java开发

Java设计模式----单例模式

2015-07-12 15:27 288 查看
从今天开始,自己深入研究一下Java的设计模式。设计模式是前人工作的总结和提炼。如果能合理地运用设计模式,不仅使系统更容易被他人理解,同时也能够使系统拥有更加合理结构。单例模式是最常用的设计模式之一,今天就整理一下单例模式的知识。

单例模式的概念

单例模式的好处

单例模式的类图

单例模式的实现

单例模式的概念

单例模式概念: 是一种对象创建模式,用于产生一个对象的具体实例,它可以确保系统中一个类只产生一个实例。

单例模式的优点

在Java语言中,能带来以下两点好处:

1、对于频繁使用的对象,可以省略创建对象所花的时间,这对于那些重量级的对象而言,是非常可观的提笔开销。

2、由于new操作的次数减少,因而对系统内存的使用频率也会降低,这将减少GC的压力,缩短GC提顿时间。

因此对于系统的关键组件和被频繁使用的对象,使用单例模式便可以有效地改善系统的性能。

单例模式的类图



单例模式的实现

第一种实现方法

public class Singleton {
//私有化构造函数,这样保证单例不会在系统中的其他代码内被实例化
private Singleton(){

}
//instance和getInstance必须是static
private static Singleton instance = new Singleton();
public static Singleton getInstance(){
return instance;
}
}


这种单例的实现方式比较简单,它的不足在于:无法对instance做延迟加载。假如单例的创建过程很慢,而由于instance 成员变量是static定义的,因此JVM加载单例类时,单例就会被创建,如果此时,这个单例类在系统中还扮演其他角色,那么在任何使用这个单例类的地方都会初始化这个单例变量。

第二种实现方法(加入了延迟加载)

public class LazySinglen {
//私有化构造函数,这样保证单例不会在系统中的其他代码内被实例化
private LazySinglen(){

}
//instance和getInstance必须是static
private static LazySinglen instance = null;
public static synchronized LazySinglen getInstance(){
if (instance == null){
instance = new LazySinglen();
}
return instance;
}
}


这种单例模式实现了延迟加载的功能,但是由于引入了同步关键字,使得系统性能降低,有些得不偿失。

第三种实现方法(使用内部类)

public class StaticSingleton {
private StaticSingleton(){

}
private static class SingletonHolder{
private static StaticSingleton instance = new StaticSingleton();
}
public static  StaticSingleton getInstance(){
return SingletonHolder.instance;
}
}


使用内部类的方式实现单例,既可以 做到延迟加载,也不必须使用同步关键字,是一种比较完善的做法。(解释:当StaticSingleton被加载时,其内部类不会被初始化,故可以确保当StaticSingleton 类被载入JVM时,不会初始化单例类,而当getInstance()方法被调用时,才会加载内部类,从而初始化instance。由于实例的建立是在类加载时完成的,故对多线程友好,getInstance()也不需要同步关键字。)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: