有哪些设计模式及各自特点
2025-3-12 diaba
设计模式(Design Patterns)是软件工程中用于解决常见问题的可复用解决方案。它们是经过验证的最佳实践,能够帮助开发者提高代码的可维护性、可扩展性和可复用性。设计模式主要分为三大类:创建型模式、结构型模式和行为型模式。
以下是常见的设计模式及其特点:
一、创建型模式(Creational Patterns)
创建型模式用于创建对象,同时隐藏创建逻辑,而不是直接使用new
操作符实例化对象。这些模式可以简化对象的创建过程,并提供更好的灵活性。
1. 单例模式(Singleton Pattern)
- 特点:确保一个类只有一个实例,并提供一个全局访问点。
- 适用场景:全局配置管理器、线程池、缓存等。
-
优点:
- 控制实例数量,节省系统资源。
- 提供全局访问点,方便管理和使用。
-
缺点:
- 如果单例实例未正确销毁,可能导致内存泄漏。
- 单例模式可能与多线程环境冲突,需要额外处理线程安全。
2. 工厂方法模式(Factory Method Pattern)
- 特点:定义一个创建对象的接口,由子类决定实例化哪一个类。
- 适用场景:当类的实例化逻辑复杂,或者需要根据条件创建不同类型的对象时。
-
优点:
- 将对象的创建逻辑封装在工厂类中,降低客户端与具体类的耦合。
- 方便扩展新的产品类型。
-
缺点:
- 每增加一个产品类,就需要增加一个对应的工厂类。
3. 抽象工厂模式(Abstract Factory Pattern)
- 特点:创建相关或依赖对象的家族,而不需明确指定具体类。
- 适用场景:当需要创建一组相关对象时。
-
优点:
- 将对象的创建逻辑集中管理,方便扩展和维护。
- 提高系统的灵活性和可扩展性。
-
缺点:
- 增加系统复杂度,抽象工厂类和具体工厂类较多。
4. 建造者模式(Builder Pattern)
- 特点:逐步构建一个复杂的对象,并允许用户只通过指定复杂对象的类型和内容就能构建它们。
- 适用场景:当对象的构造过程复杂,且需要根据不同的参数构建不同的对象时。
-
优点:
- 将对象的构建逻辑与表示分离,方便扩展。
- 可以灵活地构建不同类型的对象。
-
缺点:
- 增加了系统的复杂度,代码量较多。
5. 原型模式(Prototype Pattern)
- 特点:通过复制现有对象来创建新对象,而不是通过新建实例。
- 适用场景:当对象的创建过程复杂,或者需要频繁创建相似对象时。
-
优点:
- 提高性能,减少实例化开销。
- 方便创建复杂对象。
-
缺点:
- 需要实现克隆接口,增加了代码复杂度。
二、结构型模式(Structural Patterns)
结构型模式用于处理对象之间的组合关系,通过组合多个对象来实现更复杂的功能。
1. 适配器模式(Adapter Pattern)
- 特点:将一个类的接口转换成客户端期望的另一个接口。
- 适用场景:当需要使用一个已有的类,但其接口不符合需求时。
-
优点:
- 提高类的复用性,让原本不兼容的类可以一起工作。
-
缺点:
- 增加系统的复杂度,适配器类可能难以维护。
2. 装饰器模式(Decorator Pattern)
- 特点:动态地给一个对象添加额外的职责,而不改变其结构。
- 适用场景:当需要在运行时动态地给对象添加功能时。
-
优点:
- 提供比继承更灵活的扩展方式。
- 可以动态组合功能。
-
缺点:
- 装饰器过多可能导致系统复杂度增加。
3. 代理模式(Proxy Pattern)
- 特点:为其他对象提供代理,以控制对这个对象的访问。
- 适用场景:当需要控制对对象的访问,或者延迟对象的创建时。
-
优点:
- 可以控制对象的访问权限。
- 提供懒加载、缓存等功能。
-
缺点:
- 增加系统的复杂度,代理类可能难以维护。
4. 外观模式(Facade Pattern)
- 特点:提供一个统一的高层接口,用于访问子系统中的一群接口。
- 适用场景:当需要简化复杂子系统的使用时。
-
优点:
- 提高系统的易用性。
- 降低客户端与子系统之间的耦合。
-
缺点:
- 可能隐藏子系统的复杂性,导致问题难以排查。
5. 桥接模式(Bridge Pattern)
- 特点:将抽象与实现解耦,让它们可以独立变化。
- 适用场景:当需要将接口与实现分离时。
-
优点:
- 提高系统的可扩展性。
- 方便独立修改接口和实现。
-
缺点:
- 增加系统的复杂度。
6. 组合模式(Composite Pattern)
- 特点:将对象组合成树形结构,以表示“部分-整体”的层次结构。
- 适用场景:当需要处理对象的层次结构时。
-
优点:
- 提高代码的复用性。
- 方便操作树形结构。
-
缺点:
- 增加系统的复杂度。
7. 享元模式(Flyweight Pattern)
- 特点:通过共享来高效地支持大量细粒度的对象。
- 适用场景:当需要创建大量相似对象时。
-
优点:
- 提高性能,减少内存占用。
-
缺点:
- 需要管理共享对象池,增加了代码复杂度。
三、行为型模式(Behavioral Patterns)
行为型模式用于处理对象之间的通信和职责分配。
1. 策略模式(Strategy Pattern)
- 特点:定义一系列算法,将每个算法封装起来,并使它们可以互换。
- 适用场景:当需要在运行时动态选择算法时。
-
优点:
- 提供算法的可切换性。
- 提高代码的复用性。
-
缺点:
- 增加系统的复杂度。
2. 模板方法模式(Template Method Pattern)
- 特点:定义一个操作中的算法骨架,将一些步骤延迟到子类中实现。
- 适用场景:当需要固定算法的某些步骤,而让其他步骤可扩展时。
-
优点:
- 提高代码的复用性。
- 提供统一的算法框架。
-
缺点:
- 子类可能违反封装原则。
3. 观察者模式(Observer Pattern)
- 特点:对象间的一对多依赖关系,当一个对象改变时,所有依赖于它的对象都会得到通知。
- 适用场景:当需要实现事件驱动机制时。
-
优点:
- 实现对象间的松耦合。
- 提供事件通知机制。
-
缺点:
- 如果观察者过多,可能导致性能问题。
4. 迭代器模式(Iterator Pattern)
- 特点:顺序访问一个聚合对象中的各个元素,而不暴露其内部的表示。
- 适用场景:当需要遍历复杂数据结构时。
-
优点:
- 提供统一的遍历接口。
- 隐藏数据结构的内部细节。
-
缺点:
- 增加系统的复杂度。
5. 责任链模式(Chain of Responsibility Pattern)
- 特点:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。
- 适用场景:当需要处理多个请求,且每个请求可能由不同的对象处理时。
-
优点:
- 提供请求的解耦。
- 提高系统的灵活性。
-
缺点:
- 如果链过长,可能导致性能问题。
6. 命令模式(Command Pattern)
- 特点:将请求封装为一个对象,从而使用户可用不同的请求对客户进行参数化。
- 适用场景:当需要实现命令的撤销、重做或日志记录时。
-
优点:
- 提供请求的封装。
- 支持撤销和重做。
-
缺点:
- 增加系统的复杂度。
7. 备忘录模式(Memento Pattern)
- 特点:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
- 适用场景:当需要实现对象状态的
« 秒杀系统设计关键点及应对措施
|
实现一个简单的线程池»
日历
个人资料

diaba 寻求合作请留言或联系mail: services@jiucaiyuan.net
链接
最新文章
存档
- 2025年3月(13)
- 2025年2月(20)
- 2025年1月(2)
- 2024年10月(1)
- 2024年8月(2)
- 2024年6月(4)
- 2024年5月(1)
- 2023年7月(1)
- 2022年10月(1)
- 2022年8月(1)
- 2022年6月(11)
- 2022年5月(6)
- 2022年4月(33)
- 2022年3月(26)
- 2021年3月(1)
- 2020年9月(2)
- 2018年8月(1)
- 2018年3月(1)
- 2017年3月(3)
- 2017年2月(6)
- 2016年12月(3)
- 2016年11月(2)
- 2016年10月(1)
- 2016年9月(3)
- 2016年8月(4)
- 2016年7月(3)
- 2016年6月(4)
- 2016年5月(7)
- 2016年4月(9)
- 2016年3月(4)
- 2016年2月(5)
- 2016年1月(17)
- 2015年12月(15)
- 2015年11月(12)
- 2015年10月(6)
- 2015年9月(11)
- 2015年8月(8)
分类
热门文章
- SpringMVC:Null ModelAndView returned to DispatcherServlet with name 'applicationContext': assuming HandlerAdapter completed request handling
- Mac-删除卸载GlobalProtect
- java.lang.SecurityException: JCE cannot authenticate the provider BC
- MyBatis-Improper inline parameter map format. Should be: #{propName,attr1=val1,attr2=val2}
- Idea之支持lombok编译
标签
最新评论
- logisqykyk
Javassist分析、编辑和创建jav... - xxedgtb
Redis—常见参数配置 - 韭菜园 ... - wdgpjxydo
SpringMVC:Null Model... - rllzzwocp
Mysql存储引擎MyISAM和Inno... - dpkgmbfjh
SpringMVC:Null Model... - tzklbzpj
SpringMVC:Null Model... - bqwrhszmo
MyBatis-Improper inl... - 乐谱吧
good非常好 - diaba
@diaba:应该说是“时间的度量依据”... - diaba
如果速度增加接近光速、等于光速、甚至大于...
最新微语
- 在每件事情上花费的东西,就是生命的一部分,而我们花费的这些东西要求立即得到回报,或者在一个长时间以后得到回报。
2025-01-23 15:46
- 诺曼·文森特说:“并不是你认为自己是什么样的人,你就是什么样的人。但是你的思想是什么样,你就是什么样的人。”
2025-01-23 15:44
- 从今天起,做一个幸福的人。喂马,砍柴,(思想)周游世界
2022-03-21 23:31
- 2022.03.02 23:37:59
2022-03-02 23:38
- 几近崩溃后,找到解决方法,总是那么豁然开朗!所以遇到问题要坚持!
2018-07-18 10:49
发表评论: