----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
单例模式:顾名思义,就是让程序使用者只在任何时候就只能创建一个实例化对象。
基本实现思想:
1.不能让其他类随便建立该类的对象
2.同时可以在本类中生产一个自己的对象
3.可以对外提供获取本类中以生产的对象的方法
这样就可以保证,本类的对象在堆内存中只有一个,而对其的引用可以有多个,可以用一下代码来体现:
public class TestSingle {
public static void main(String[] args) {
Single s1 = Single.getInstnce();
Single s2 = Single.getInstnce();
s1.setName("aaa");
System.out.println(s2.getName());
}
}
class Single {
/**
* 为了保证其他类不能创建本类对象,将对应构造函数私有化即可(这里以空参数构造函数为例)
*/
private Single() {
}
/**
* 在本类中创建一个本类的对象,设置为静态是因为下面的方法, 因为方法不能通过对象打点方式调用,故只能是静态的,故此处s对象为静态对象
*/
private static Single s = new Single();
/**
* 此方法是对外提供的,故其权限为public,又因其不能通过对象打点方式调用, 故为静态的,故s对象也为静态的
*
* @return s对象
*/
public static Single getInstnce() {
return s;
}
/**
* 为了检验,此处给一变量和其封装方法
*/
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
以上是单例模式中的一种实现形式,习惯上称之为饿汉式。
还有一种实现方式,称之为懒汉式,代码如下(为了突出表示,省去部分代码):
class Single {
/**
* 为了保证其他类不能创建本类对象,将对应构造函数私有化即可(这里以空参数构造函数为例)
*/
private Single() {
}
/**
* 此处并未真正创建对象,而是创建了一个空引用
*/
private static Single s = null;
/**
* 此方法是对外提供的,故其权限为public,又因其不能通过对象打点方式调用, 故为静态的,故s对象也为静态的
*
* @return s对象
*/
public static Single getInstnce() {
//s为空时才在这里创建对象
if (s == null) {
s = new Single();
}
return s;
}
}
饿汉式与懒汉式的不同之处在于,是否在类加载的时候就创建对象了,饿汉式在类加载的过程中就直接创建对象了,而懒汉式知道调用方法时才创建。
除了以上的区别外,饿汉式是线程安全的,故企业开发中常用,而懒汉式是非线程安全的,可以做以下改进:
class Single {
/**
* 为了保证其他类不能创建本类对象,将对应构造函数私有化即可(这里以空参数构造函数为例)
*/
private Single() {
}
/**
* 此处并未真正创建对象,而是创建了一个空引用
*/
private static Single s = null;
/**
* 此方法是对外提供的,故其权限为public,又因其不能通过对象打点方式调用, 故为静态的,故s对象也为静态的
*
* @return s对象
*/
public static Single getInstnce() {
// s为空时才在这里创建对象
if (s == null) {
//在此处加同步锁即可
synchronized (Single.class) {
s = new Single();
}
}
return s;
}
}
安全机制即为在创建对象的时候运用双重判断,并在内层判断中加同步锁,也可在方法上直接加同步锁而方法内只进行一次判断,但同步锁会带来低效问题,且方法上加锁的话,每次都得进行加锁操作,为了减少加锁带来的低效问题,故使用双重判断并在内层判断中加同步锁以减少加锁次数。
总结:显然,我们使用单例是为了使用单例所产生的对象,所以一般情况下开发用饿汉式!