常用设计模式中的工厂模式,责任链模式,策略模式和单例模式的简单说明

设计模式的六大原则:

**单一职责原则:**就一个类而言,应该仅有一个引起它变化的原因。

**开放-封闭原则:**软件实体可以拓展但是不可以修改。

**依赖倒转原则:**高层模块和低层模块两者都应依赖抽象;抽象不应依赖细节,细节依赖抽象。

**里氏代换原则:**子类型必须能够替换掉它们的父类型。

**合成聚合复用原则:**尽量使用合成/聚合,尽量不要使用类继承。

**迪米特原则:**一个对象应该对其他对象保持最少的了解。不跟陌生人说话。

1. 工厂模式(Factory Pattern)

核心思想:通过工厂类统一创建对象,隐藏对象创建的细节,让使用者无需直接调用构造函数。

解决问题

  • 避免对象创建逻辑(如复杂初始化、依赖处理)分散在代码中,便于维护。
  • 当需要更换对象类型时,只需修改工厂,无需改动所有使用处。

示例

java 复制代码
// 产品接口
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)

核心思想:将多个处理者组成一条链,请求沿链传递,直到某个处理者能处理为止。

解决问题

  • 避免请求发送者与多个处理者直接耦合(如请假审批:员工→组长→经理→总监,无需员工知道具体审批人)。
  • 灵活调整处理者顺序或增减处理者。

示例

java 复制代码
// 处理者接口
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-elseswitch 判断(如支付方式:支付宝、微信、银联,每种方式算法不同)。
  • 算法可独立扩展,不影响使用方。

示例

java 复制代码
// 策略接口
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)

核心思想 :保证一个类在整个系统中只有一个实例,并提供全局访问点。

解决问题

  • 避免频繁创建销毁重量级对象(如配置管理器、线程池),节省资源。
  • 确保全局状态一致性(如计数器、日志对象)。

示例(线程安全版)

java 复制代码
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(同一实例)

总结

模式 核心特点 典型场景
工厂模式 统一创建对象,隐藏创建细节 复杂对象初始化、产品族创建
责任链模式 请求沿处理者链传递,动态分工 审批流程、过滤器链、异常处理
策略模式 算法封装,动态切换 支付方式、排序算法、折扣计算
单例模式 全局唯一实例,节省资源 配置管理、日志对象、线程池

这些模式的核心是分离变化与不变,让系统更灵活、易维护。

相关推荐
张小姐的猫8 小时前
【Linux】网络编程 —— HTTP协议(上)
linux·运维·服务器·网络·http·单例模式·策略模式
杨充11 小时前
10.可测试性实战设计
设计模式·开源·代码规范
杨充11 小时前
9.重构十二式的实战
设计模式·开源·代码规范
杨充11 小时前
6.设计原则的全景图
设计模式·开源·全栈
杨充11 小时前
2.面向对象的特性
设计模式
杨充11 小时前
7.SOLID原则案例汇
设计模式·开源·全栈
杨充11 小时前
8.反模式与坏味道
设计模式·开源·代码规范
杨充11 小时前
3.接口vs抽象类比较
设计模式
咖啡八杯14 小时前
文法、BNF与AST
java·设计模式·解释器模式·ast·文法