常用软件开发设计模式有哪些

发布时间:2022-01-15 16:22:26 作者:iii
来源:亿速云 阅读:125
# 常用软件开发设计模式有哪些

## 引言

在软件开发领域,设计模式(Design Pattern)是解决特定问题的可重用方案。设计模式不是可以直接转换为代码的完整设计,而是描述如何在特定情境下解决常见问题的模板。通过使用设计模式,开发者可以提升代码的可维护性、可扩展性和复用性。本文将详细介绍常用的软件开发设计模式,包括创建型、结构型和行为型三大类。

---

## 一、创建型模式(Creational Patterns)

创建型模式关注对象的创建机制,帮助开发者以更灵活的方式创建对象,同时隐藏创建逻辑的具体实现。

### 1. 单例模式(Singleton Pattern)
**核心思想**:确保一个类只有一个实例,并提供全局访问点。  
**应用场景**:配置管理、日志记录、数据库连接池等需要全局唯一实例的场景。  
**实现方式**:
```java
public class Singleton {
    private static Singleton instance;
    
    private Singleton() {} // 私有构造器
    
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

优缺点
- 优点:节省资源,严格控制访问。
- 缺点:可能引入全局状态,不利于单元测试。

2. 工厂方法模式(Factory Method Pattern)

核心思想:定义一个创建对象的接口,但由子类决定实例化哪个类。
应用场景:需要动态生成不同子类对象的场景(如UI组件库)。
实现方式

interface Product {
    void create();
}

class ConcreteProductA implements Product {
    @Override
    public void create() { System.out.println("Product A"); }
}

abstract class Creator {
    abstract Product factoryMethod();
}

class ConcreteCreatorA extends Creator {
    @Override
    Product factoryMethod() { return new ConcreteProductA(); }
}

3. 抽象工厂模式(Abstract Factory Pattern)

核心思想:提供一个接口,用于创建相关或依赖对象的家族,而无需指定具体类。
应用场景:跨平台UI库(如Windows/Mac按钮风格切换)。
类图关系
- 抽象工厂(AbstractFactory)
- 具体工厂(ConcreteFactory1/2)
- 抽象产品(AbstractProductA/B)
- 具体产品(ProductA1/B1等)

4. 建造者模式(Builder Pattern)

核心思想:将复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。
应用场景:需要分步构造复杂对象(如SQL查询生成器)。
示例

class Computer {
    private String CPU;
    private String RAM;
    // 通过Builder设置属性
}

class ComputerBuilder {
    private Computer computer = new Computer();
    public ComputerBuilder setCPU(String cpu) { ... }
    public Computer build() { return computer; }
}

5. 原型模式(Prototype Pattern)

核心思想:通过复制现有对象来创建新对象,而非通过实例化。
应用场景:对象创建成本高(如数据库查询结果克隆)。
实现方式:实现Cloneable接口并重写clone()方法。


二、结构型模式(Structural Patterns)

结构型模式关注类和对象的组合方式,以形成更大的结构。

1. 适配器模式(Adapter Pattern)

核心思想:将一个类的接口转换成客户端期望的另一个接口。
类型
- 类适配器(通过继承)
- 对象适配器(通过组合)
应用场景:整合不兼容的第三方库。

2. 装饰器模式(Decorator Pattern)

核心思想:动态地给对象添加额外职责,比继承更灵活。
应用场景:Java I/O流(如BufferedInputStream包装FileInputStream)。
示例

interface Coffee {
    double getCost();
}

class BasicCoffee implements Coffee { ... }

class MilkDecorator implements Coffee {
    private Coffee decoratedCoffee;
    public MilkDecorator(Coffee coffee) { this.decoratedCoffee = coffee; }
    @Override
    public double getCost() { return decoratedCoffee.getCost() + 0.5; }
}

3. 代理模式(Proxy Pattern)

核心思想:为其他对象提供一种代理以控制对这个对象的访问。
类型
- 虚拟代理(延迟加载)
- 保护代理(权限控制)
- 远程代理(RPC调用)
示例:Spring AOP中的动态代理。

4. 外观模式(Facade Pattern)

核心思想:为子系统中的一组接口提供一个统一的高层接口。
应用场景:简化复杂API调用(如支付系统集成)。

5. 组合模式(Composite Pattern)

核心思想:将对象组合成树形结构以表示”部分-整体”层次结构。
应用场景:文件系统、UI组件树。

6. 享元模式(Flyweight Pattern)

核心思想:通过共享技术有效支持大量细粒度对象。
应用场景:字符渲染池、游戏中的粒子系统。

7. 桥接模式(Bridge Pattern)

核心思想:将抽象部分与其实现部分分离,使它们可以独立变化。
应用场景:跨平台图形渲染(如OpenGL/Vulkan切换)。


三、行为型模式(Behavioral Patterns)

行为型模式关注对象之间的通信和职责分配。

1. 观察者模式(Observer Pattern)

核心思想:定义对象间的一对多依赖关系,当一个对象状态改变时,所有依赖者自动收到通知。
应用场景:事件处理系统、MVC模型。
Java实现java.util.Observable类。

2. 策略模式(Strategy Pattern)

核心思想:定义一系列算法,封装每个算法,并使它们可以互换。
应用场景:支付方式选择、排序算法切换。
示例

interface SortingStrategy {
    void sort(int[] data);
}

class QuickSort implements SortingStrategy { ... }
class BubbleSort implements SortingStrategy { ... }

class Context {
    private SortingStrategy strategy;
    public void setStrategy(SortingStrategy s) { ... }
    public void executeSort(int[] data) { strategy.sort(data); }
}

3. 命令模式(Command Pattern)

核心思想:将请求封装为对象,从而支持参数化、队列化和日志化请求。
应用场景:GUI操作撤销/重做、任务队列。

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

核心思想:将请求的发送者和接收者解耦,使多个对象都有机会处理请求。
应用场景:审批流程、异常处理链。

5. 状态模式(State Pattern)

核心思想:允许对象在其内部状态改变时改变它的行为。
应用场景:订单状态流转、游戏角色状态。

6. 模板方法模式(Template Method Pattern)

核心思想:定义算法骨架,将某些步骤延迟到子类实现。
应用场景:框架中的生命周期钩子(如Spring JdbcTemplate)。

7. 访问者模式(Visitor Pattern)

核心思想:将算法与对象结构分离,便于新增操作而不修改类。
应用场景:编译器AST处理、文档格式转换。

8. 中介者模式(Mediator Pattern)

核心思想:用一个中介对象来封装一系列对象交互。
应用场景:聊天室、航空管制系统。

9. 备忘录模式(Memento Pattern)

核心思想:捕获并外部化对象的内部状态以便后续恢复。
应用场景:游戏存档、事务回滚。

10. 迭代器模式(Iterator Pattern)

核心思想:提供一种方法顺序访问聚合对象的元素而不暴露其内部表示。
Java实现java.util.Iterator接口。


四、设计模式的选择与组合

1. 如何选择设计模式

2. 常见模式组合


五、设计模式的局限性

  1. 过度使用会导致代码复杂化
  2. 某些模式可能引入性能开销(如深拷贝)
  3. 现代语言特性可能替代部分模式(如Lambda替代策略模式)

结语

设计模式是软件工程经验的结晶,但绝非银弹。开发者应在理解其思想的基础上灵活运用,而非机械套用。建议通过以下步骤深入学习:
1. 阅读《设计模式:可复用面向对象软件的基础》(GoF经典)
2. 分析开源项目(如Spring、JDK)中的模式实现
3. 在实际项目中从小规模应用开始实践

“模式不是发明,而是发现。” —— Christopher Alexander(模式理论先驱) “`

推荐阅读:
  1. 软件开发常用设计模式—单例模式总结(c++版)
  2. IOS 常用的设计模式

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

软件开发

上一篇:大数据报表热切换是什么

下一篇:springboot整合quartz定时任务框架的方法是什么

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》