Java 单例设计模式、模板设计模式
单例设计模式
什么是单例设计模式?
单例设计模式,即保证一个类在内存中只有一个对象
。
单例设计模式有两种实现方式,分别是饿汉
单例设计模式和懒汉
单例设计模式
推荐使用饿汉
单例设计模式,因为懒汉单例设计模式会存在线程安全问题,解决方案如下示例。
饿汉单例设计模式
设计步骤:
- 私有化构造函数。
- 声明本类中的引用变量,并使用该变量指向本类对象。
- 提供一个公共静态的方法获取本类的对象。
代码示例:
class SingleInstance {
// 私有化构造函数
private SingleInstance() {
}
// 声明本类中的引用变量,并使用该变量指向本类对象
private static SingleInstance singleInstance = new SingleInstance();
// 提供一个公共静态的方法获取本类的对象
public static SingleInstance getInstance() {
return singleInstance;
}
}
public class JavaBase {
public static void main(String[] args) {
SingleInstance s1 = SingleInstance.getInstance();
SingleInstance s2 = SingleInstance.getInstance();
System.out.println(s1==s2); // true
}
}
懒汉单例设计模式
设计步骤:
- 私有化构造函数。
- 声明本类的引用变量,但不创建对象。
- 提供公共静态的方法获取本类的对象。在获取之前,先判断是否已经创建了本类对象,如果已经创建了,那么直接返回对象即可;若没创建,则先创建对象再返回对象。
代码示例:
class SingleInstance {
// 私有化构造函数
private SingleInstance() {
}
// 声明本类中的引用变量,并使用该变量指向本类对象
private static SingleInstance singleInstance;
// 提供一个公共静态的方法获取本类的对象
public static SingleInstance getInstance() {
if (singleInstance == null) {
synchronized ("锁") {
if (singleInstance == null) {
singleInstance = new SingleInstance();
}
}
}
return singleInstance;
}
}
public class JavaBase {
public static void main(String[] args) {
SingleInstance s1 = SingleInstance.getInstance();
SingleInstance s2 = SingleInstance.getInstance();
System.out.println(s1==s2); // true
}
}
模板设计模式
模版模式,指某类事情的步骤有些是固定的,有些是会发生变化的,那么这时候我们可以为这类事情提供一个模版代码,从而提高效率。
设计步骤:
- 先写出解决该类事情其中的一件的解决方案。
- 分析代码,把会发生变化的代码抽取出来独立成一个方法。
- 把该方法描述成一个抽象的方法。
- 使用 final 修饰模板方法,防止别人重写你的模板方法。
代码示例:
// 模板方案
abstract class MyRuntime {
public final void runTime(){
long startTime = System.currentTimeMillis(); // 记录当前系统时间
run();
long endTime = System.currentTimeMillis(); // 记录当前系统时间
System.out.println("运行时间为"+(endTime-startTime)+"毫秒");
}
// 分析代码,把会发生变化的代码抽取出来独立成一个方法,供用户使用(重写)
public abstract void run();
}
// 重写模板方案中的抽象方法
public class JavaBase extends MyRuntime {
public static void main(String[] args) {
JavaBase j = new JavaBase();
j.runTime();
}
// 重写抽象方法
public void run(){
for(int i = 0; i<100; i++){
System.out.println(i);
}
}
}