Java 单例设计模式、模板设计模式


单例设计模式

什么是单例设计模式?

单例设计模式,即保证一个类在内存中只有一个对象

单例设计模式有两种实现方式,分别是饿汉单例设计模式和懒汉单例设计模式

推荐使用饿汉单例设计模式,因为懒汉单例设计模式会存在线程安全问题,解决方案如下示例。

饿汉单例设计模式

设计步骤:

  1. 私有化构造函数。
  2. 声明本类中的引用变量,并使用该变量指向本类对象。
  3. 提供一个公共静态的方法获取本类的对象。

代码示例:

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
    }
}

懒汉单例设计模式

设计步骤:

  1. 私有化构造函数。
  2. 声明本类的引用变量,但不创建对象。
  3. 提供公共静态的方法获取本类的对象。在获取之前,先判断是否已经创建了本类对象,如果已经创建了,那么直接返回对象即可;若没创建,则先创建对象再返回对象。

代码示例:

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
    }
}

模板设计模式

模版模式,指某类事情的步骤有些是固定的,有些是会发生变化的,那么这时候我们可以为这类事情提供一个模版代码,从而提高效率。

设计步骤:

  1. 先写出解决该类事情其中的一件的解决方案。
  2. 分析代码,把会发生变化的代码抽取出来独立成一个方法。
  3. 把该方法描述成一个抽象的方法。
  4. 使用 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);
        }
    }

}
posted @ 2021-10-15 14:30  Juno3550  阅读(60)  评论(0编辑  收藏  举报