设计模式
为了更好地规范和优化,设计模式提供了一套系统的方法论。在 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");
}
}
为什么需要单例模式
设计工具类时,没有必要创建多个实例,因为工具类通常只有类的方法而没有属性。单例模式可以减少对象创建时的内存消耗,并提高访问效率。