跳到主要内容

设计模式

为了更好地规范和优化,设计模式提供了一套系统的方法论。在 Java 中共有 23 种设计模式,常用的有十几种。

单例模式 Singleton

单例模式确保一个类只有一个实例存在。

package com.DesignPattern;

/*
* 单例模式
* */
public class Test {
public static void main (String[] args) {
// 饿汉模式 类加载时就创建对象
HungryManSingleton singleton1 = HungryManSingleton.getInstance();
HungryManSingleton singleton2 = HungryManSingleton.getInstance();
System.out.println(singleton1 == singleton2); // true

// 懒汉模式 类加载时不创建对象
LazyManSingleton singleton3 = LazyManSingleton.getInstance(1, 2);
LazyManSingleton singleton4 = LazyManSingleton.getInstance(3, 4);
System.out.println(singleton3 == singleton4); // true

singleton3.sumingcheng();
singleton4.sumingcheng();
}
}

饿汉模式

饿汉模式通过静态属性直接初始化实例对象,类加载后立即创建,程序结束后被释放。

构造器私有化,类中创建实例,并提供一个获取实例的方法。

package com.DesignPattern;

/*
* 创建单例的方法
* 1.构造器私有化
* 2.类中构造实例
* 3.提供一个获取实例的方法
* */
public class HungryManSingleton {
// 私有的构造器
private HungryManSingleton () {
}

// 给静态属性初始化为本类的实例对象
private static HungryManSingleton instance = new HungryManSingleton();

// 通过静态方法获取实例
public static HungryManSingleton getInstance () {
return instance;
}

public void sumingcheng () {
System.out.println("sumingcheng");
}
}

懒汉模式(推荐)

懒汉模式在调用方法时才初始化实例,因此被称为懒汉。

package com.DesignPattern;

public class LazyManSingleton {
private LazyManSingleton () {
}

private int a;
private int b;

private LazyManSingleton (int a, int b) {
this.a = a;
this.b = b;
}

private static LazyManSingleton instance;

public static LazyManSingleton getInstance (int a, int b) {
if (instance == null) {
instance = new LazyManSingleton(a, b);
}
return instance;
}

public static LazyManSingleton getInstance () {
if (instance == null) {
instance = new LazyManSingleton();
}
return instance;
}

public void sumingcheng () {
System.out.println("懒汉模式 " + (a + b));
}
}

两种模式对比

饿汉模式通过静态属性直接初始化实例对象,类加载后创建,程序结束后释放,虽然占用内存时间较长,但效率较高。

懒汉模式在静态方法中创建实例,方法调用时初始化,程序结束后释放。推荐使用懒汉模式,但在多线程环境下,当前的懒汉单例模式可能存在问题。

静态方法类

所有的方法都是静态的,例如 Mach 类。构造方法私有化并将方法静态化,使得类无法被实例化。然而,静态方法类的缺点是常驻内存。

package com.DesignPattern;

public class StaticSingleton {
private StaticSingleton () {
}

public static void sumingcheng () {
System.out.println("staticSingleton");
}
}

为什么需要单例模式

设计工具类时,没有必要创建多个实例,因为工具类通常只有类的方法而没有属性。单例模式可以减少对象创建时的内存消耗,并提高访问效率。