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

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

2015-06-01 14:58 295 查看
------- android培训java培训、期待与您交流! ----------

单例的作用:只能让内存中只有这一个类的存在,也就是说这个类只能有一个实例

设计的目的以及什么时候调用:优化内存,如果一个类它只有一个变量,那么它是以类存在的话,此时就可以设计成单例模式。

如何设计:

1,它不能被其他类给实例化了

2,它可以自己提供一个实例化方法

3,这个方法是静态的,要对外访问。

2种单例:

懒汉式,顾名思义,比较懒,当要用到的时候,再去加载它,不然就不给加载。

饿汉式:用到的时候就已经加载好了。

饿汉式代码:

class Singleton {
//私有,静态的类自身实例
privatestatic Singleton instance = new Singleton();

//私有的构造子(构造器,构造函数,构造方法)
privateSingleton() {
}

//公开,静态的工厂方法
publicstatic Singleton getInstance() {
returninstance;
}
}


懒汉式代码:

class Single {
//私有构造方法,不允许其他类创建对象

privateSingle() {
};

privatestatic Single instance = null;

//提供获取对象的方法

publicstatic Single getInstance() {

if(instance == null) { // 用到的时候再去加载它.

instance= new Single();

}
returninstance;
}
}

饿汉式变种

class Singleton {

//私有,静态的类自身实例

privatestatic Singleton instance = null;
static{

instance= new Singleton(); // 一出来就直接给它加载了,先把类给实例了

}

//私有的构造子(构造器,构造函数,构造方法)

privateSingleton() {
}

//公开,静态的工厂方法

publicstatic Singleton getInstance() {

returninstance;// 然后就不管是不是被调用了,反正就是先被加载了
}
}

懒汉式要注意的地方:

class Single {
/*
* 如果单例是被多条线程给执行了, 那么执行懒汉式的时候,就出现
*
* 两条线程同时执行了null的方法, 那么A线程执行等于null,实例化一个对象了,B再进来又被实例化了一条
*
* 这是不允许的,那么就要用到synchronized同步锁这个概念
*/

privateSingle() {
};

privatestatic Single instance = null;

//提供获取对象的方法

publicstatic Single getInstance() {

//提高判断锁的效率不让每次都判断

//如果是synchronized在前面的话,每次都要判断锁,效率很低。

if(instance == null)

//多线程的同步操作,锁是自身的字节码

synchronized(Single.class) {

if(instance == null)

//自己创建对象

instance= new Single();

}

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