java-design-patterns源码解析:设计模式实现原理
引言:为什么需要深入理解设计模式实现?
在软件开发中,设计模式是解决常见问题的可重用方案。然而,仅仅知道模式的概念是不够的——真正掌握设计模式需要深入理解其实现细节和适用场景。java-design-patterns项目提供了超过100种设计模式的Java实现,是学习设计模式实现原理的绝佳资源。
通过分析这个项目的源码,你将能够:
- 🎯 深入理解各种设计模式的具体实现方式
- 🔧 掌握模式在实际项目中的应用技巧
- 📊 学习如何根据需求选择合适的模式
- 🚀 提升代码设计和架构能力
项目架构概览
java-design-patterns项目采用模块化结构,每个设计模式都有独立的目录,包含完整的实现代码、测试用例和文档。
核心设计模式实现深度解析
1. 单例模式(Singleton)的多线程安全实现
单例模式确保一个类只有一个实例,并提供全局访问点。项目中展示了多种线程安全的实现方式:
枚举实现(推荐方式)
public enum EnumIvoryTower {
INSTANCE;
@Override
public String toString() {
return getDeclaringClass().getCanonicalName() + "@" + hashCode();
}
}
双重检查锁定(Double-Checked Locking)
public class ThreadSafeDoubleCheckLocking {
private static volatile ThreadSafeDoubleCheckLocking instance;
private ThreadSafeDoubleCheckLocking() {
// 防止通过反射实例化
if (instance != null) {
throw new IllegalStateException("Already initialized.");
}
}
public static ThreadSafeDoubleCheckLocking getInstance() {
ThreadSafeDoubleCheckLocking result = instance;
if (result == null) {
synchronized (ThreadSafeDoubleCheckLocking.class) {
result = instance;
if (result == null) {
instance = result = new ThreadSafeDoubleCheckLocking();
}
}
}
return result;
}
}
初始化按需持有者惯用法(Bill Pugh)
public class BillPughImplementation {
private BillPughImplementation() {}
private static class InstanceHolder {
private static final BillPughImplementation INSTANCE = new BillPughImplementation();
}
public static BillPughImplementation getInstance() {
return InstanceHolder.INSTANCE;
}
}
2. 工厂方法模式(Factory Method)的灵活应用
工厂方法模式定义了一个创建对象的接口,但让子类决定实例化哪个类。
// 武器接口
public interface Weapon {
String toString();
}
// 武器类型枚举
public enum WeaponType {
SHORT_SWORD("short sword"), SPEAR("spear"), AXE("axe"), UNDEFINED("");
private final String title;
WeaponType(String title) {
this.title = title;
}
@Override
public String toString() {
return title;
}
}
// 铁匠接口(工厂方法)
public interface Blacksmith {
Weapon manufactureWeapon(WeaponType weaponType);
}
// 精灵铁匠实现
public class ElfBlacksmith implements Blacksmith {
private static final Map<WeaponType, ElfWeapon> ELFARSENAL;
static {
ELFARSENAL = new EnumMap<>(WeaponType.class);
ELFARSENAL.put(WeaponType.SHORT_SWORD, new ElfWeapon(WeaponType.SHORT_SWORD));
ELFARSENAL.put(WeaponType.SPEAR, new ElfWeapon(WeaponType.SPEAR));
ELFARSENAL.put(WeaponType.AXE, new ElfWeapon(WeaponType.AXE));
}
@Override
public Weapon manufactureWeapon(WeaponType weaponType) {
return ELFARSENAL.get(weaponType);
}
}
3. 观察者模式(Observer)的事件驱动架构
观察者模式定义了对象间的一对多依赖关系,当一个对象状态改变时,所有依赖者都会收到通知。
// 观察者接口
public interface WeatherObserver {
void update(WeatherType currentWeather);
}
// 主题(被观察者)
@Slf4j
public class Weather {
private WeatherType currentWeather;
private final List<WeatherObserver> observers;
public Weather() {
observers = new ArrayList<>();
currentWeather = WeatherType.SUNNY;
}
public void addObserver(WeatherObserver obs) {
observers.add(obs);
}
public void removeObserver(WeatherObserver obs) {
observers.remove(obs);
}
public void timePasses() {
var enumValues = WeatherType.values();
currentWeather = enumValues[(currentWeather.ordinal() + 1) % enumValues.length];
LOGGER.info("The weather changed to {}.", currentWeather);
notifyObservers();
}
private void notifyObservers() {
for (var obs : observers) {
obs.update(currentWeather);
}
}
}
// 具体观察者实现
@Slf4j
public class Orcs implements WeatherObserver {
@Override
public void update(WeatherType currentWeather) {
LOGGER.info("The orcs are facing " + currentWeather.getDescription() + " weather now");
}
}
设计模式实现的最佳实践
1. 线程安全考虑
| 模式类型 | 线程安全策略 | 适用场景 |
|---|---|---|
| 单例模式 | 枚举、双重检查锁定、静态内部类 | 全局配置、连接池 |
| 工厂模式 | 无状态工厂方法 | 对象创建解耦 |
| 观察者模式 | 同步通知、CopyOnWriteArrayList | 事件驱动系统 |
2. 性能优化技巧
// 使用EnumMap提高性能
private static final Map<WeaponType, Weapon> ARSENAL = new EnumMap<>(WeaponType.class);
// 延迟初始化减少内存占用
private static class LazyHolder {
static final ExpensiveObject INSTANCE = new ExpensiveObject();
}
// 使用volatile确保可见性
private volatile Resource resource;
3. 测试策略
项目中为每个模式都提供了完整的测试用例:
@Test
public void testSingletonInstance() {
var instance1 = IvoryTower.getInstance();
var instance2 = IvoryTower.getInstance();
assertSame(instance1, instance2);
}
@Test
public void testFactoryMethod() {
Blacksmith blacksmith = new ElfBlacksmith();
Weapon weapon = blacksmith.manufactureWeapon(WeaponType.SPEAR);
assertTrue(weapon instanceof ElfWeapon);
}
常见设计模式应用场景对比
| 设计模式 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 单例模式 | 全局配置、日志、连接池 | 节省资源、全局访问 | 测试困难、可能成为瓶颈 |
| 工厂方法 | 对象创建复杂、需要扩展 | 解耦、易于扩展 | 增加类数量 |
| 观察者 | 事件驱动、消息通知 | 松耦合、动态订阅 | 通知顺序不确定 |
实战:构建一个完整的设计模式应用
让我们结合多个模式构建一个简单的电商订单系统:
// 使用工厂方法创建订单
public interface OrderFactory {
Order createOrder(Customer customer, List<Product> products);
}
// 使用观察者模式通知订单状态变化
public class Order implements OrderSubject {
private OrderStatus status;
private List<OrderObserver> observers = new ArrayList<>();
public void setStatus(OrderStatus status) {
this.status = status;
notifyObservers();
}
public void addObserver(OrderObserver observer) {
observers.add(observer);
}
private void notifyObservers() {
for (OrderObserver observer : observers) {
observer.update(this);
}
}
}
// 使用单例模式管理库存
public class InventoryManager {
private static final InventoryManager INSTANCE = new InventoryManager();
private InventoryManager() {}
public static InventoryManager getInstance() {
return INSTANCE;
}
}
总结与进阶学习建议
通过分析java-design-patterns项目的源码,我们深入理解了设计模式的实现原理和应用技巧。关键收获包括:
- 模式选择的重要性:不同的场景需要不同的模式,没有万能的设计模式
- 实现细节决定成败:线程安全、性能优化等细节直接影响模式效果
- 测试驱动开发:为每个模式编写测试用例确保正确性
- 模式组合使用:实际项目中往往需要多个模式协同工作
进阶学习路径
- 深入理解每个模式的适用场景和限制
- 学习模式之间的组合和协作
- 研究JDK和流行框架中的设计模式应用
- 实践在真实项目中应用设计模式
- 关注模式的反模式和滥用情况
设计模式是软件工程的重要基石,掌握它们的实现原理将显著提升你的架构设计能力和代码质量。java-design-patterns项目为你提供了宝贵的学习资源,建议结合实际项目需求深入研究和实践。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



