【334、单例模式、模板方法】

89 阅读2分钟

下面是单例模式和模板方法在Java中的代码实现示例:

单例模式是一种设计模式,它的目的是确保某个类只有一个实例,并提供对该实例的全局访问点。该模式常被用于管理全局状态、资源池等场景,可以有效地控制对象的创建和使用。在单例模式中,通常将构造函数设为私有的,以防止外部代码创建多个实例。

  1. 单例模式的Java代码实现
public class Singleton {
    private static Singleton instance;
    
    private Singleton() {
        // 防止外部实例化
    }
    
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

在上面的代码中,我们使用了私有的构造函数来防止外部实例化。getInstance方法通过判断instance是否为null来控制实例的创建,如果instance为null,则创建一个新的实例,否则直接返回已有的实例。该代码实现可以确保在整个应用程序中只有一个Singleton实例存在。

  1. 模板方法的Java代码实现

模板方法是一种行为型设计模式,它定义了一个算法框架,将某些步骤的具体实现延迟到子类中。在模板方法中,将算法的核心步骤抽象出来,形成一个模板,而将具体的实现交给子类去完成。这样可以使得算法的整体结构稳定不变,同时又能够灵活地扩展和修改子类中的具体实现。模板方法常被用于定义框架或库中的算法,例如排序、搜索等操作。

public abstract class SortAlgorithm {
    public final void sort(int[] array) {
        if (array == null || array.length <= 1) {
            return;
        }
        doSort(array);
    }
    
    protected abstract void doSort(int[] array);
}

public class BubbleSort extends SortAlgorithm {
    @Override
    protected void doSort(int[] array) {
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array.length - i - 1; j++) {
                if (array[j] > array[j + 1]) {
                    int temp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = temp;
                }
            }
        }
    }
}

public class QuickSort extends SortAlgorithm {
    @Override
    protected void doSort(int[] array) {
        quickSort(array, 0, array.length - 1);
    }
    
    private void quickSort(int[] array, int left, int right) {
        if (left >= right) {
            return;
        }
        int pivot = partition(array, left, right);
        quickSort(array, left, pivot - 1);
        quickSort(array, pivot + 1, right);
    }
    
    private int partition(int[] array, int left, int right) {
        int pivot = array[right];
        int i = left - 1;
        for (int j = left; j < right; j++) {
            if (array[j] <= pivot) {
                i++;
                int temp = array[i];
                array[i] = array[j];
                array[j] = temp;
            }
        }
        int temp = array[i + 1];
        array[i + 1] = array[right];
        array[right] = temp;
        return i + 1;
    }
}

在上面的代码中,我们定义了一个抽象类SortAlgorithm,其中包含一个final的sort方法和一个抽象的doSort方法。sort方法是一个模板方法,它定义了算法的框架,调用了doSort方法完成具体实现。doSort方法是一个抽象方法,需要子类去实现具体的排序算法。我们创建了BubbleSort和QuickSort两个子类,它们分别实现了doSort方法来完成具体的排序算法。这样,我们可以使用SortAlgorithm类来定义排序算法的框架,同时又可以灵活地扩展和修改具体的排序算法实现。