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

设计模式之单例模式

2016-05-15 22:17 337 查看

设计模式之单例模式

Java中常用的设计模式有23种,单例模式是其中的一种比较常见且比较简单的一种。

单例模式,顾名思义表示在整个应用程序中该类有且仅有一个对象,通常的类我们可以通过new创建出许多改类的对象,但是在有些情况下,我们只允许使用一个对象。通常改类的管理对象是需要保持单一管理的,这时使用一个对象,就可以确保这些数据仅由改对象掌握

单例模式实现主要分为以下几个步骤

将构造函数私有化
private ClassName(){}


定义一个静态变量,改变量的类型为该类的类型
private static ClassName demo;


定义一个静态方法,返回值为该类类型,并且将静态变量返回
public static ClassName getInstance()


单例模式有也分为两种模式

饿汉模式:在类创建的时候便创建改类的实例

public class EagerDemo{

private static EagerDemo eagerDemo = new EagerDemo();

private EagerDemo(){}

public static EagerDemo getInstance(){
return eagerDemo;
}
}


这种形式便成为“饿汉模式”,懒汉模式的静态变量是在类初始化时就进行加载,所以不会出现返回值为null的情况

2. 懒汉模式:该类在调用静态方法时候才进行实例化


public class LazyDemo{
private static LazyDemo lazyDemo = null;

private LazyDemo(){}

public static LazyDemo getInstance(){
//在返回的时候判断该对象是否为空
return lazyDemo != null ? lazyDemo : (lazyDemo = new LazyDemo());
}
}


这种模式便是饿汉模式,在类进行加载的时候不会创建类的实例,当调用静态方法获得该类的对象的时候才进行实例化,也叫延时初始化。但是懒汉模式存在线程安全问题,如果线程A运行到了判断实例是否存在后还未进行初始化便被挂起等待下一个时间片段,而此时B线程也运行到了该处,这时它进行了实例化并且返回了实例,而A线程又将创建一个该类的实例,于是便会出现两个实例的情况,解决该问题的方法便是使用synchronized关键字加锁

public class LazyDemo(){
private static LazyDemo lazyDemo = null;

private LazyDemo(){}

public static LazyDemo getInstance(){
if(lazyDemo == null){
synchronized(LazyDemo.class){ //加锁保证同一时刻只有一个线程可以进入该代码块中
if(lazyDemo == null){
lazyDemo = new LazyDemo();
}
}
}
return lazyDemo;
}
}


两种模式的对比:

“懒汉模式”在加载类的时候相比于“饿汉模式”要更快,因为其只进行对象的声明并未对其进行初始化,而在调用方法之时,“饿汉模式”则会略快于“懒汉模式”,因为其在调用方法时才进行初始化操作,并且相比“饿汉模式”多了一步判断。但是正是因为“懒汉模式”的延时初始化,其有更多的使用场景。例如该类管理程序中某一个功能,但是在使用该程序中并不一定需要使用该功能,那么这时候我们可以使用“饿汉模式”,当整个应用程序开启的时候我们无需进行实例化,加快了程序加载的速度,而当需要使用到该功能的时候再去进行加载。这样既可以节省程序初始化的时间,也可以减少内存的占用,从而达到更好的用户体验。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 设计模式