常用设计模式中的工厂模式,责任链模式,策略模式和单例模式的简单说明
设计模式的六大原则:
单一职责原则:就一个类而言,应该仅有一个引起它变化的原因。
开放-封闭原则:软件实体可以拓展但是不可以修改。
依赖倒转原则:高层模块和低层模块两者都应依赖抽象;抽象不应依赖细节,细节依赖抽象。
里氏代换原则:子类型必须能够替换掉它们的父类型。
合成聚合复用原则:尽量使用合成/聚合,尽量不要使用类继承。
迪米特原则:一个对象应该对其他对象保持最少的了解。不跟陌生人说话。
1. 工厂模式(Factory Pattern)
核心思想:通过工厂类统一创建对象,隐藏对象创建的细节,让使用者无需直接调用构造函数。
解决问题:
- 避免对象创建逻辑(如复杂初始化、依赖处理)分散在代码中,便于维护。
- 当需要更换对象类型时,只需修改工厂,无需改动所有使用处。
示例:
// 产品接口
interface Car {void drive();
}// 具体产品
class Benz implements Car {@Override public void drive() { System.out.println("驾驶奔驰"); }
}class BMW implements Car {@Override public void drive() { System.out.println("驾驶宝马"); }
}// 工厂类
class CarFactory {// 根据类型创建对象public static Car createCar(String type) {if ("benz".equals(type)) return new Benz();if ("bmw".equals(type)) return new BMW();return null;}
}// 使用:无需直接new,通过工厂获取
Car car = CarFactory.createCar("benz");
car.drive();
2. 责任链模式(Chain of Responsibility Pattern)
核心思想:将多个处理者组成一条链,请求沿链传递,直到某个处理者能处理为止。
解决问题:
- 避免请求发送者与多个处理者直接耦合(如请假审批:员工→组长→经理→总监,无需员工知道具体审批人)。
- 灵活调整处理者顺序或增减处理者。
示例:
// 处理者接口
abstract class Approver {protected Approver next; // 下一个处理者public Approver(Approver next) { this.next = next; }abstract void approve(int days);
}// 具体处理者
class TeamLeader extends Approver {public TeamLeader(Approver next) { super(next); }@Override void approve(int days) {if (days <= 3) System.out.println("组长批准");else next.approve(days); // 无法处理,交给下一个}
}class Manager extends Approver {public Manager(Approver next) { super(next); }@Override void approve(int days) {if (days <= 7) System.out.println("经理批准");else next.approve(days);}
}// 使用:构建责任链
Approver chain = new TeamLeader(new Manager(null));
chain.approve(5); // 经理批准
3. 策略模式(Strategy Pattern)
核心思想:定义多种算法(策略),封装成独立类,使算法可动态切换。
解决问题:
- 避免大量
if-else
或switch
判断(如支付方式:支付宝、微信、银联,每种方式算法不同)。 - 算法可独立扩展,不影响使用方。
示例:
// 策略接口
interface PaymentStrategy {void pay(double amount);
}// 具体策略
class Alipay implements PaymentStrategy {@Override public void pay(double amount) {System.out.println("支付宝支付:" + amount);}
}class WechatPay implements PaymentStrategy {@Override public void pay(double amount) {System.out.println("微信支付:" + amount);}
}// 使用策略的类
class Order {private PaymentStrategy strategy;public Order(PaymentStrategy strategy) { this.strategy = strategy; }public void pay(double amount) { strategy.pay(amount); }
}// 使用:动态切换策略
Order order = new Order(new Alipay());
order.pay(100); // 支付宝支付
order = new Order(new WechatPay());
order.pay(200); // 微信支付
4. 单例模式(Singleton Pattern)
核心思想:保证一个类在整个系统中只有一个实例,并提供全局访问点。
解决问题:
- 避免频繁创建销毁重量级对象(如配置管理器、线程池),节省资源。
- 确保全局状态一致性(如计数器、日志对象)。
示例(线程安全版):
public class Singleton {// 私有静态实例,volatile防止指令重排private static volatile Singleton instance;// 私有构造函数,禁止外部创建private Singleton() {}// 全局访问点,双重检查锁保证线程安全public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}
}// 使用:全局唯一实例
Singleton obj1 = Singleton.getInstance();
Singleton obj2 = Singleton.getInstance();
System.out.println(obj1 == obj2); // true(同一实例)
总结
模式 | 核心特点 | 典型场景 |
---|---|---|
工厂模式 | 统一创建对象,隐藏创建细节 | 复杂对象初始化、产品族创建 |
责任链模式 | 请求沿处理者链传递,动态分工 | 审批流程、过滤器链、异常处理 |
策略模式 | 算法封装,动态切换 | 支付方式、排序算法、折扣计算 |
单例模式 | 全局唯一实例,节省资源 | 配置管理、日志对象、线程池 |
这些模式的核心是分离变化与不变,让系统更灵活、易维护。