您的位置:首页 > 职场人生

黑马程序员--------单例设计模式

2015-01-27 16:49 155 查看
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一.      为什么要使用单例设计模式?

可以保证一个类在内存中的对象唯一性。

比如,程序读取一个配置文件的时候,就可以把配置为文件封装成对象。当要求方便的操作其中的数据,又要保证多个程序读到的是同一个配置文件对象,就需要这个配置文件对象在内存中是唯一的

二.      怎样保证对象唯一性呢?

思路:

1.      让本类的构造函数私有化,这样其他的类就不可以创建本类对象。

2.      在本类中创建一个私有的本类对象。

3.      对外提供方法,让其他的类可以获取这个对象。

3.      单例设计模式的分类:

单例设计模式有两种,一种是懒汉设计模式(又称为延迟加载设计模式),一种是饿汉设计模式。

饿汉设计模式的代码体现如下:

class Single
{

//私有本类中的构造函数

private Single(){}

//创建本类对象

private static Single s= new Single();

//对外提供获取本来对象方法

public static Single getInstance()
{

return s;

}
}
注意问题:

  由于外界无法创建Single对象,没有对象,那就无法调用getInstance方法,这时需要将getInstance方法静态化,这样外界就可以通过类名直接调用该方法。

懒汉模式:

public class SingleDemo

{
public static voidmain(String[] args)
{
//获取Single类的实例对象s
Single s = Single.getInstance();

//获取Single类的实例对象s2
Single s2 = Single.getInstance();
System.out.println(s==s2); //true
}
}

class Single
{
//私有构造函数
private Single(){}

//在本类中创建本类对象
private static Single instance = null;

//对外提供静态访问方法,获取本类实例对象
public static Single getInstance()
{
if(instance == null ) // 这里会有线程安全问题
{
instance = new Single();
}
return instance;
}

}

三,总结:

懒汉模式,它的特点是运行时获得对象的速度比较慢,但加载类的时候比较快。它在整个应用的生命周期只有一部分时间在占用资源。

饿汉模式,它的特点是加载类的时候比较慢,但运行时获得对象的速度比较快。它从加载到应用结束会一直占用资源。

从用户体验的角度来说,我们应该首选饿汉模式。我们愿意等待某个程序花较长的时间初始化,却不喜欢在程序运行时等待太久,给人一种反应迟钝的感觉,所以对于有重量级对象参与的单例模式,我们推荐使用饿汉模式

在并发的情况下,懒汉式是不安全的。如果两个线程,我们称它们为线程1和线程2,在同一时间调用getInstance()方法,如果线程1先进入if块,然后线程2进行控制,那么就会有两个实例被创建。

四,懒汉设计模式缺陷的解决方案:
我们可以使用线程锁来解决这个问题,代码反映如下:

class Single
{
//私有构造函数
private Single(){}

//在本类中创建本类对象
private static Single instance = null;

//对外提供静态访问方法,获取本类实例对象
public static Single getInstance()
{
if(instance == null)
{
synchronized(Single.class)
{
if(instance == null )
{
instance = new Single();
}
}
}
return instance;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: