Java设计模式

设计模式概述

设计模式是软件开发中针对反复出现问题总结出的通用解决方案。根据目的和结构,设计模式可分为创建型、结构型和行为型三类。以下是 Java 中 23 种设计模式的分类及示例:

一、创建型模式(5 种)

1. 单例模式(Singleton)

确保一个类只有一个实例,并提供全局访问点。

public class Singleton {
    private static final Singleton INSTANCE = new Singleton();
    private Singleton() {} // 私有构造函数
    public static Singleton getInstance() {
        return INSTANCE;
    }
}
2. 工厂模式(Factory Method)

定义创建对象的接口,让子类决定实例化哪个类。

// 产品接口
interface Product { void operation(); }

// 具体产品
class ConcreteProductA implements Product {
    @Override public void operation() { System.out.println("Product A"); }
}

// 工厂类
class Factory {
    public Product createProduct(String type) {
        if ("A".equals(type)) return new ConcreteProductA();
        return null;
    }
}
3. 抽象工厂模式(Abstract Factory)

提供创建一系列相关对象的接口,无需指定具体类。

// 抽象工厂
interface GUIFactory {
    Button createButton();
    Checkbox createCheckbox();
}

// Windows工厂
class WindowsFactory implements GUIFactory {
    @Override public Button createButton() { return new WindowsButton(); }
    @Override public Checkbox createCheckbox() { return new WindowsCheckbox(); }
}
4. 建造者模式(Builder)

将复杂对象的构建与表示分离,允许相同构建过程创建不同表示。

class Car {
    private String engine;
    private String wheels;
    // getters/setters

    static class Builder {
        private String engine;
        private String wheels;

        public Builder engine(String engine) {
            this.engine = engine;
            return this;
        }

        public Car build() {
            Car car = new Car();
            car.engine = this.engine;
            car.wheels = this.wheels;
            return car;
        }
    }
}
5. 原型模式(Prototype)

通过复制现有实例创建新对象,无需知道创建细节。

interface Prototype {
    Prototype clone();
}

class ConcretePrototype implements Prototype {
    @Override
    public Prototype clone() {
        try {
            return (Prototype) super.clone();
        } catch (CloneNotSupportedException e) {
            return null;
        }
    }
}

二、结构型模式(7 种)

6. 适配器模式(Adapter)

将一个类的接口转换成用户期望的另一个接口。

// 目标接口
interface Target { void request(); }

// 适配者类
class Adaptee { public void specificRequest() { System.out.println("适配者方法"); } }

// 适配器
class Adapter implements Target {
    private Adaptee adaptee;
    public Adapter(Adaptee adaptee) { this.adaptee = adaptee; }
    @Override public void request() { adaptee.specificRequest(); }
}
7. 桥接模式(Bridge)

将抽象部分与实现部分分离,使它们可以独立变化。

// 实现接口
interface Color { void applyColor(); }

// 抽象类
abstract class Shape {
    protected Color color;
    public Shape(Color color) { this.color = color; }
    abstract void draw();
}

// 具体实现
class RedColor implements Color {
    @Override public void applyColor() { System.out.println("红色"); }
}
8. 组合模式(Composite)

将对象组合成树形结构以表示 “部分 - 整体” 的层次结构。

// 组件接口
interface Component { void operation(); }

// 叶子节点
class Leaf implements Component {
    @Override public void operation() { System.out.println("叶子操作"); }
}

// 容器节点
class Composite implements Component {
    private List<Component> children = new ArrayList<>();
    @Override public void operation() { children.forEach(Component::operation); }
    public void add(Component c) { children.add(c); }
}
9. 装饰器模式(Decorator)

动态地给对象添加额外职责,比继承更灵活。

// 组件接口
interface Beverage { String getDescription(); double cost(); }

// 具体组件
class Espresso implements Beverage {
    @Override public String getDescription() { return "Espresso"; }
    @Override public double cost() { return 1.99; }
}

// 装饰器基类
abstract class CondimentDecorator implements Beverage {
    protected Beverage beverage;
}
10. 外观模式(Facade)

为子系统中的一组接口提供统一高层接口,简化客户端使用。

class SubsystemA { public void operationA() { System.out.println("系统A操作"); } }
class SubsystemB { public void operationB() { System.out.println("系统B操作"); } }

class Facade {
    private SubsystemA a = new SubsystemA();
    private SubsystemB b = new SubsystemB();
    public void operation() {
        a.operationA();
        b.operationB();
    }
}
11. 享元模式(Flyweight)

通过共享技术有效支持大量细粒度对象。

// 享元接口
interface Flyweight { void operation(int extrinsicState); }

// 具体享元
class ConcreteFlyweight implements Flyweight {
    private final String intrinsicState;
    public ConcreteFlyweight(String state) { this.intrinsicState = state; }
    @Override public void operation(int extrinsicState) {
        System.out.printf("内蕴状态: %s, 外蕴状态: %d%n", intrinsicState, extrinsicState);
    }
}
12. 代理模式(Proxy)

为其他对象提供一种代理以控制对这个对象的访问。

// 主题接口
interface Subject { void request(); }

// 真实主题
class RealSubject implements Subject {
    @Override public void request() { System.out.println("真实请求"); }
}

// 代理主题
class Proxy implements Subject {
    private RealSubject realSubject;
    @Override public void request() {
        if (realSubject == null) realSubject = new RealSubject();
        preRequest();
        realSubject.request();
        postRequest();
    }
}

三、行为型模式(11 种)

13. 责任链模式(Chain of Responsibility)

使多个对象都有机会处理请求,避免请求发送者和接收者的耦合。

// 处理者接口
abstract class Handler {
    protected Handler successor;
    public void setSuccessor(Handler successor) { this.successor = successor; }
    public abstract void handleRequest(int request);
}

// 具体处理者
class ConcreteHandler1 extends Handler {
    @Override public void handleRequest(int request) {
        if (request < 10) System.out.println("处理请求: " + request);
        else if (successor != null) successor.handleRequest(request);
    }
}
14. 命令模式(Command)

将请求封装为对象,使你可以用不同请求参数化客户端。

// 命令接口
interface Command { void execute(); }

// 接收者
class Receiver {
    public void action() { System.out.println("执行操作"); }
}

// 具体命令
class ConcreteCommand implements Command {
    private Receiver receiver;
    @Override public void execute() { receiver.action(); }
}
15. 解释器模式(Interpreter)

给定语言,定义其文法表示,并定义解释器解释该文法。

// 表达式接口
interface Expression { int interpret(); }

// 终结符表达式
class Number implements Expression {
    private final int number;
    public Number(int number) { this.number = number; }
    @Override public int interpret() { return number; }
}

// 非终结符表达式
class Add implements Expression {
    private final Expression left;
    private final Expression right;
    @Override public int interpret() { return left.interpret() + right.interpret(); }
}
16. 迭代器模式(Iterator)

提供一种方法顺序访问一个聚合对象中的各个元素。

// 迭代器接口
interface Iterator<T> {
    boolean hasNext();
    T next();
}

// 集合接口
interface Aggregate<T> {
    Iterator<T> createIterator();
}

// 具体集合
class ConcreteAggregate implements Aggregate<String> {
    private final List<String> items = new ArrayList<>();
    @Override public Iterator<String> createIterator() { return new ConcreteIterator(items); }
}
17. 中介者模式(Mediator)

定义一个中介对象封装一系列对象交互,使各对象间松耦合。

// 中介者接口
interface Mediator {
    void send(String message, Colleague colleague);
}

// 同事类
abstract class Colleague {
    protected Mediator mediator;
    public Colleague(Mediator mediator) { this.mediator = mediator; }
    public abstract void send(String message);
    public abstract void receive(String message);
}
18. 备忘录模式(Memento)

在不破坏封装性的前提下,捕获对象内部状态并保存。

// 备忘录
class Memento {
    private final String state;
    public Memento(String state) { this.state = state; }
    public String getState() { return state; }
}

// 原发器
class Originator {
    private String state;
    public void setState(String state) { this.state = state; }
    public Memento saveStateToMemento() { return new Memento(state); }
    public void getStateFromMemento(Memento memento) { state = memento.getState(); }
}
19. 观察者模式(Observer)

定义对象间一对多依赖关系,当一个对象状态变化时,所有依赖者被通知。

// 主题接口
interface Subject {
    void registerObserver(Observer o);
    void removeObserver(Observer o);
    void notifyObservers();
}

// 观察者接口
interface Observer {
    void update(int temperature);
}
20. 状态模式(State)

允许对象在内部状态改变时改变行为,看起来像修改了类。

// 状态接口
interface State { void handle(); }

// 上下文
class Context {
    private State state;
    public void setState(State state) { this.state = state; }
    public void request() { state.handle(); }
}
21. 策略模式(Strategy)

定义一系列算法,将每个算法封装,并使它们可以互换。

// 策略接口
interface Strategy { int doOperation(int num1, int num2); }

// 具体策略
class AddStrategy implements Strategy {
    @Override public int doOperation(int num1, int num2) { return num1 + num2; }
}

// 上下文
class Context {
    private Strategy strategy;
    public int executeStrategy(int num1, int num2) {
        return strategy.doOperation(num1, num2);
    }
}
22. 模板方法模式(Template Method)

定义算法骨架,将一些步骤延迟到子类实现。

// 抽象类
abstract class Game {
    abstract void initialize();
    abstract void startPlay();
    abstract void endPlay();

    // 模板方法
    public final void play() {
        initialize();
        startPlay();
        endPlay();
    }
}
23. 访问者模式(Visitor)

表示作用于某对象结构中各元素的操作,使你可以在不改变元素类的前提下定义新操作。

// 元素接口
interface Element { void accept(Visitor visitor); }

// 具体元素
class ConcreteElementA implements Element {
    @Override public void accept(Visitor visitor) { visitor.visit(this); }
    public String operationA() { return "具体元素A的操作"; }
}

// 访问者接口
interface Visitor {
    void visit(ConcreteElementA element);
    void visit(ConcreteElementB element);
}

总结

设计模式是软件设计的重要工具,合理使用可提高代码的可维护性、可扩展性和可复用性。实际开发中应根据需求选择合适的模式,避免过度设计。

目录: 前 言 第一部分 大旗不挥,谁敢冲锋——热身篇 第1章 单一职责原则 1.1 我是“牛”类,我可以担任多职吗 1.2 绝杀技,打破你的传统思维 1.3 我单纯,所以我快乐 1.4 最佳实践 第2章 里氏替换原则 2.1 爱恨纠葛的父子关系 2.2 纠纷不断,规则压制 2.3 最佳实践 第3章 依赖倒置原则 3.1 依赖倒置原则的定义 3.2 言而无信,你太需要契约 3.3 依赖的三种写法 3.4 最佳实践 第4章 接口隔离原则 4.1 接口隔离原则的定义 4.2 美女何其多,观点各不同 4.3 保证接口的纯洁性 4.4 最佳实践 第5章 迪米特法则 5.1 迪米特法则的定义 5.2 我的知识你知道得越少越好 5.3 最佳实践 第6章 开闭原则 6.1 开闭原则的定义 6.2 开闭原则的庐山真面目 6.3 为什么要采用开闭原则 6.4 如何使用开闭原则 6.5 最佳实践 第二部分 我惹了谁——真刀实枪篇 第7章 单例模式 7.1 我是皇帝我独苗 7.2 单例模式的定义 7.3 单例模式的应用 7.4 单例模式的扩展 7.5 最佳实践 第8章 工厂方法模式 8.1 女娲造人的故事 8.2 工厂方法模式的定义 8.3 工厂方法模式的应用 8.3.1 工厂方法模式的优点 8.3.2 工厂方法模式的使用场景 8.4 工厂方法模式的扩展 8.5 最佳实践 第9章 抽象工厂模式 9.1 女娲的失误 9.2 抽象工厂模式的定义 9.3 抽象工厂模式的应用 9.3.1 抽象工厂模式的优点 9.3.2 抽象工厂模式的缺点 9.3.3 抽象工厂模式的使用场景 9.3.4 抽象工厂模式的注意事项 9.4 最佳实践 第10章 模板方法模式 10.1 辉煌工程—制造悍马 10.2 模板方法模式的定义 10.3 模板方法模式的应用 10.4 模板方法模式的扩展 10.5 最佳实践 第11章 建造者模式 11.1 变化是永恒的 11.2 建造者模式的定义 11.3 建造者模式的应用 11.4 建造者模式的扩展 11.5 最佳实践 第12章 代理模式 12.1 我是游戏至尊 12.2 代理模式的定义 12.3 代理模式的应用 12.3.1 代理模式的优点 12.3.2 代理模式的应用 12.4 代理模式的扩展 12.4.1 普通代理 12.4.2 强制代理 12.4.3 代理是有个性的 12.4.4 虚拟代理 12.4.5 动态代理 12.5 最佳实践 第13章 原型模式 13.1 个性化电子账单 13.2 原型模式的定义 13.3 原型模式的应用 13.3.1 原型模式的优点 13.3.2 原型模式的使用场景 13.4 原型模式的注意事项 13.4.1 构造函数不会被执行 13.4.2 浅拷贝和深拷贝 13.4.3 clone与final两个冤家 13.5 最佳实践 第14章 中介者模式 14.1 进销存管理是这个样子的吗? 14.2 中介者模式的定义 14.3 中介者模式的应用 14.4 中介者模式的实际应用 14.5 最佳实践 第15章 命令模式 15.1 项目经理也难当 15.2 命令模式的定义 15.3 命令模式的应用 15.3.1 命令模式的优点 15.3.2 命令模式的缺点 15.3.3 命令模式的使用场景 15.4 命令模式的扩展 15.4.1 未讲完的故事 15.4.2 反悔问题 15.5 最佳实践 第16章 责任链模式 16.1 古代妇女的枷锁—“三从四德” 16.2 责任链模式的定义 16.3 责任链模式的应用 16.3.1 责任链模式的优点 16.3.2 责任链模式的缺点 16.3.3 责任链模式的注意事项 16.4 最佳实践 第17章 装饰模式 17.1 罪恶的成绩单 17.2 装饰模式的定义 17.3 装饰模式应用 17.3.1 装饰模式的优点 17.3.2 装饰模式的缺点 17.3.3 装饰模式的应用 17.4 最佳实践 第18章 策略模式 18.1 刘备江东娶妻,赵云他容易吗 18.2 策略模式的定义 18.3 策略模式的应用 18.3.1 策略模式的优点 18.3.2 策略模式的缺点 18.3.3 策略模式的应用 18.3.4 策略模式的注意事项 18.4 策略模式的扩展 18.5 最佳实践 第19章 适配器模式 19.1 业务发展—上帝才能控制 19.2 适配器模式的定义 19.3 适配器模式的应用 19.3.1 适配器模式的优点 19.3.2 适配器模式的应用 19.3.3 适配器模式的注意事项 19.4 适配器模式的扩展 19.5 最佳实践 第20章 迭代器模式 20.1 整理项目信息—苦差事 20.2 迭代器模式的定义 20.3 迭代器模式的应用 20.4 最佳实践 第21章 组合模式 21.1 公司的人事架构是这样的吗 21.2 组合模式的定义 21.3 组合模式的应用 21.3.1 组合模式的优点 21.3.2 组合模式的缺点 21.3.3 组合模式的应用 21.3.4 组合模式的注意事项 21.4 组合模式的扩展 21.4.1 真实的组合模式 21.4.2 透明的组合模式 21.4.3 组合模式的遍历 21.5 最佳实践 第22章 观察者模式 22.1 韩非子身边的卧底是谁派来的 22.2 观察者模式的定义 22.3 观察者模式的应用 22.3.1 观察者模式的优点 22.3.2 观察者模式的缺点 22.3.3 观察者模式的应用 22.3.4 观察者模式的注意事项 22.4 观察者模式的扩展 22.4.1 Java世界中的观察者模式 22.4.2 项目中真实观察者模式 22.4.3 订阅发布模型 22.5 最佳实践 第23章 门面模式 23.1 我要投递信件 23.2 门面模式的定义 23.3 门面模式的应用 23.3.1 门面模式的优点 23.3.2 门面模式的缺点 23.3.3 门面模式的应用 23.4 门面模式的注意事项 23.4.1 一个子系统可以有多个门面 23.4.2 门面不参与子系统内的业务逻辑 23.5 最佳实践 第24章 备忘录模式 24.1 如此追女孩子,你还不乐 24.2 备忘录模式的定义 24.3 备忘录模式的应用 24.3.1 备忘录模式的应用 24.3.2 备忘录模式的注意事项 24.4 备忘录模式的扩展 24.4.1 clone方式的备忘录 24.4.2 多状态的备忘录模式 24.4.3 多备份的备忘录 24.4.4 封装得更好一点 24.5 最佳实践 第25章 访问者模式 25.1 员工的隐私何在? 25.2 访问者模式的定义 25.3 访问者模式的应用 25.3.1 访问者模式的优点 25.3.2 访问者模式的缺点 25.3.3 访问者模式的应用 25.4 访问者模式的扩展 25.4.1 统计功能 25.4.2 多个访问者 25.4.3 双分派 25.5 最佳实践 第26章 状态模式 26.1 城市的纵向发展功臣—电梯 26.2 状态模式的定义 26.3 状态模式的应用 26.3.1 状态模式的优点 26.3.2 状态模式的缺点 26.3.3 状态模式的应用 26.3.4 状态模式的注意事项 26.4 最佳实践 第27章 解释器模式 27.1 四则运算你会吗 27.2 解释器模式的定义 27.3 解释器模式的应用 27.3.1 解释器模式的优点 27.3.2 解释器模式的缺点 27.3.3 解释器模式使用的场景 27.3.4 解释器模式的注意事项 27.4 最佳实践 第28章 享元模式 28.1 内存溢出,司空见惯 28.2 享元模式的定义 28.3 享元模式的应用 28.3.1 享元模式优点和缺点 28.3.2 享元模式的应用 28.4 享元模式的扩展 28.4.1 线程安全的问题 28.4.2 性能平衡 28.5 最佳实践 第29章 桥梁模式 29.1 我有一个梦想…… 29.2 桥梁模式的定义 29.3 桥梁模式的应用 29.3.1 桥梁模式的优点 29.3.2 桥梁模式的应用 29.3.3 桥梁模式的注意事项 29.4 最佳实践 第三部分 谁的地盘谁做主—模式PK篇 第30章 创建类模式大PK 30.1 工厂方法模式VS建造者模式 30.1.1 按工厂方法建造超人 30.1.2 按建造者模式建造超人 30.1.3 最佳实践 30.2 抽象工厂模式VS建造者模式 30.2.1 按抽象工厂模式生产车辆 30.2.2 按建造者模式生产车辆 30.2.3 最佳实践 第31章 结构类模式大PK 31.1 代理模式VS装饰模式 31.1.1 代理模式 31.1.2 装饰模式 31.1.3 最佳实践 31.2 装饰模式VS适配器模式 31.2.1 按装饰模式描述丑小鸭 31.2.2 按适配器模式实现丑小鸭 31.2.3 最佳实践 第32章 行为类模式大PK 32.1 命令模式VS策略模式 32.1.1 策略模式实现压缩算法 32.1.2 命令模式实现压缩算法 32.1.3 小结 32.2 策略模式VS状态模式 32.2.1 策略模式实现人生 32.2.2 状态模式实现人生 32.2.3 小结 32.3 观察者模式VS责任链模式 32.3.1 责任链模式实现DNS解析过程 32.3.2 触发链模式实现DNS解析过程 32.3.3 小结 第33章 跨战区PK 33.1 策略模式VS桥梁模式 33.1.1 策略模式实现邮件发送 33.1.2 桥梁模式实现邮件发送 33.1.3 最佳实践 33.2 门面模式VS中介者模式 33.2.1 中介者模式实现工资计算 33.2.2 门面模式实现工资计算 33.2.3 最佳实践 33.3 包装模式群PK 33.3.1 代理模式 33.3.2 装饰模式 33.3.3 适配器模式 33.3.4 桥梁模式 33.3.5 最佳实践 第四部分 完美世界—混编模式 第34章 命令模式+责任链模式 34.1 搬移UNIX的命令 34.2 混编小结 第35章 工厂方法模式+策略模式 35.1 迷你版的交易系统 35.2 混编小结 第36章 观察者模式+中介者模式 36.1 事件触发器的开发 36.2 混编小结 第37章 规格模式 37.1 规格模式的实现 37.2 最佳实践 第38章 MVC框架 38.1 MVC框架的实现 38.1.1 MVC的系统架构 38.1.2 模型管理器 38.1.3 值栈 38.1.4 视图管理器 38.1.5 工具类 38.2 最佳实践 附录:23个设计模式
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值