设计模式(全名:软件设计模式),是一套反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。 使用设计模式是为了可重用代码,让代码更容易被他人理解,保证代码可靠性,程序的重用性。
1. 单例模式 1.1单例模式的特点 单例类只能有一个实例。 单例类必须自己创建自己唯一的实例。 单例类必须给所有其他对象提供这个实例。 1.2 实现过程【懒汉】 第一次/*
* 1. 私有的构造方法
* 共有的话别人一调用就会有新的单例对象,没法保证单一的实例
* 2. 公有静态的方法 ---- 用来调用私有的构造方法
* 由于构造方法是私有的,我们要想调用的话,必须在类内有一个方法,这个方法能够调用这个构造方法,而且在类外也可以使用。
*/
public class SingleTon {
private SingleTon() {}
public static SingleTon getInstance() {
return new SingleTon();
}
}
但是以上代码有问题:
a . 每次调用 getInstance() 方法返回的是不同的对象(new)。
b. 我们希望其只有一个实例
public class SingleTon {
private SingleDog() {}
//使用static是为了数据的持久性
private static SingleTon instance = null;
public static SingleTon getInstance() {
if (null == instance) {
instance = new SingleTon();
}
return instance;
}
}
这样调用能基本实现我们的需求,但是仍然存在一个问题,如果在多线程的情况下,有两个线程同时调用getInstance()方法且满足if条件(有这个可能偶),这个时候得到的对象不是同一个对象。
第三次改进public class SingleTon {
private SingleTon() {}
private static SingleTon instance = null;
//只要创建对象就必须进入同步代码块
public static synchronized SingleTon getInstance() {
if (null == instance) {
instance = new SingleTon();
}
return instance;
}
}
// 我们为了进一步优化,可以这样写
public class SingleTon {
private SingleTon() {}
private static SingleTon instance = null;
public static SingleTon getInstance() {
// 判定是否为空,只有是空的时候才去进入同步代码部分
if (null == instance) {
synchronized (SingleTon .class) {
//再次检查,以防有多个都在准备进入同步代码块
if (null == instance) {
instance = new SingleTon();
}
}
}
return instance;
}
}
}
第三次改进的代码又称为懒汉单例模式(自己懒得new对象,通过方法new),接下来介绍饿汉单例模式。
1.3 饿汉单例模式public class SingleTon {
private static SingleTon instance = new SingleTon();
private SingleTon() {}
public static SingleTon instance() {
return instance;
}
}
这个不存在懒汉的多线程安全问题,这个在调用方法的时候就已经存在了唯一的单例类对象,方法只是将这个类对象的地址进行返回。