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

设计模式的六大原则:

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

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

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

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

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

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

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(同一实例)

总结

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

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

相关推荐
new_daimond12 小时前
设计模式-享元模式详解
java·设计模式·享元模式
青草地溪水旁12 小时前
设计模式(C++)详解—享元模式(1)
c++·设计模式·享元模式
郝学胜-神的一滴13 小时前
享元模式(Flyweight Pattern)
开发语言·前端·c++·设计模式·软件工程·享元模式
charlie11451419113 小时前
精读《C++20设计模式》——创造型设计模式:构建器系列
c++·设计模式·c++20·构造器模式
青草地溪水旁14 小时前
设计模式(C++)详解—享元模式(2)
c++·设计模式·享元模式
笨手笨脚の14 小时前
设计模式-原型模式
java·设计模式·创建型设计模式·原型模式
new_daimond14 小时前
设计模式实战-设计模式组合使用
设计模式
Vanranrr15 小时前
Data Wrapper(数据包装器) 设计模式实践
设计模式
爱吃烤鸡翅的酸菜鱼15 小时前
基于多设计模式的状态扭转设计:策略模式与责任链模式的实战应用
java·后端·设计模式·责任链模式·策略模式