# 6种设计原则,23种设计模式 **Repository Path**: chenmit007/Design-pattern ## Basic Information - **Project Name**: 6种设计原则,23种设计模式 - **Description**: 6种设计原则,23种设计模式 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 10 - **Created**: 2023-06-23 - **Last Updated**: 2023-07-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 6种设计原则,23种设计模式 本仓库用于存放小陈学习设计模式的代码和资料,2023年6月23创建开始维护。 [参考1- Java 23种设计模式全归纳](https://github.com/youlookwhat/DesignPattern) [java设计模式 刘伟||P7大佬简易教学2小时 图解设计模式最新版(4K+期末速成+工作学习)](https://www.bilibili.com/video/BV17P41177c7/?p=2&spm_id_from=pageDriver&vd_source=49f971e690075b4e24b59d71e69cb754) [Gitee博主参仓库说明文档介绍](https://gitee.com/longtaosoft/DesignPattern/blob/master/README.md#) #### 设计模式的目的 1. 代码重用性 2. 可读性 3. 可扩展性 4. 可靠性 1. 高内聚,低耦合 #### 6种软件开发设计原则 1. 单一职责原则Single Responsibility Principle(重要) 2. 里氏替换原则(重要) 3. 依赖倒置原则(重要) 4. 接口隔离原则(重要) 5. 迪米特法则(重要) 6. 开闭原则(重要) | 设计原则 | Design principle | | ----------------- | ------------------------------------ | | `单一职责原则SRP` | `Single Responsibility Principle` | | `里氏替换原则LSP` | `Liskov Substitution Principle` | | `依赖倒置原则DIP` | `Dependence Inversion Principle` | | `接口隔离原则ISP` | `Interface Segregation Principle` | | `迪米特法则LOD` | `Law of Demeter Principle` | | `开闭原则OCP` | `Open Closed Principle` | #### 23种设计模式 1. 单例模式(重要😀) [参考这个实现吧](https://www.bilibili.com/video/BV1eK4y1L71n/?spm_id_from=trigger_reload&vd_source=49f971e690075b4e24b59d71e69cb754) **单例模式:** 某个类只能有一个实例,提供一个全局的访问点。 2. 工厂方法模式(重要😀) **简单工厂:** 一个工厂类根据传入的参量决定创建出那一种产品类的实例。客户只需要告诉工厂就行 **工厂方法:** 定义一个创建对象的接口,让子类决定实例化那个类。 3. 抽象工厂模式 **抽象工厂:** 创建相关或依赖对象的家族,而无需明确指定具体类。 可以生成不同品牌的产品族(多个不同产品) 有1个接口表示抽象工厂、多个实现类表示具体工厂,有多个接口表示产品族的各个产品、然后具体每个工厂生产对应的产品(对应多个实现类) ![image-20230720105429505](C:/Users/31530/AppData/Roaming/Typora/typora-user-images/image-20230720105429505.png) 4. 模板方法模式(重要) 5. 建造者模式(重要😀) **建造者模式:** 封装一个复杂对象的构建过程,并可以按步骤构造。 有一个指挥者 指挥不同的建造者去组装产品搭配,产品有多个属性表示不同组件、抽象一个接口表示建造者、不同实现类可以加工产品类的不同属性; 6. 代理模式(重要😀) 7. 原型模式(重要😀) **原型模式:** 通过复制现有的实例来创建新的实例。 浅克隆:引用类型在**堆内存**,使用同一个(一个变全都变化); 深克隆 8. 中介者模式 9. 命令模式 10. 责任链模式(重要😀) 11. 装饰模式(重要😀) 12. 策略模式(重要😀) 13. 适配器模式(重要😀) 14. 迭代器模式(重要😀) 15. 组合模式 16. 观察者模式(重要😀) 17. 门面模式 18. 备忘录模式 19. 访问者模式 20. 状态模式 21. 解释器模式 22. 亨元模式 23. 桥梁模式 策略模式(重要😀) 、 **责任链模式:**、**观察者模式:** 对象间的一对多的依赖关系。 **原型模式:** 通过复制现有的实例来创建新的实例。 **适配器模式:** 将一个类的方法接口转换成客户希望的另外一个接口。 类似电压转换器、支持多种格式的播放器 ![image-20230722211859726](C:/Users/31530/AppData/Roaming/Typora/typora-user-images/image-20230722211859726.png) **桥接模式:** 将抽象部分和它的实现部分分离,使它们都可以独立的变化。 ![image-20230722212714017](C:/Users/31530/AppData/Roaming/Typora/typora-user-images/image-20230722212714017.png) **组合模式:** 将对象组合成树形结构以表示“”部分-整体“”的层次结构。 **装饰模式:** 动态的给对象添加新的功能。不改变对象内部增加功能 ![image-20230722213219167](C:/Users/31530/AppData/Roaming/Typora/typora-user-images/image-20230722213219167.png) **外观模式:** 对外提供一个统一的方法,来访问子系统中的一群接口。 **享元模式:** 通过共享技术来有效的支持大量细粒度的对象。 **代理模式:** 为其他对象提供一个代理以便控制这个对象的访问。 客户不直接访问对象,而是通过一个代理来实现。控制访问 ​ ![image-20230722220744843](C:/Users/31530/AppData/Roaming/Typora/typora-user-images/image-20230722220744843.png) ![image-20230722214700714](C:/Users/31530/AppData/Roaming/Typora/typora-user-images/image-20230722214700714.png) **访问者模式:** 在不改变数据结构的前提下,增加作用于一组对象元素的新功能。 **模板模式:** 定义一个算法结构,而将一些步骤延迟到子类实现。 **策略模式:** 定义一系列算法,把他们封装起来,并且使它们可以相互替换。 **状态模式:** 允许一个对象在其对象内部状态改变时改变它的行为。 **观察者模式:** 对象间的一对多的依赖关系。 **备忘录模式**:在不破坏封装的前提下,保持对象的内部状态。 **中介者模式:** 用一个中介对象来封装一系列的对象交互。 **迭代器模式:** 一种遍历访问聚合对象中各个元素的方法,不暴露该对象的内部结构。 **解释器模式:** 给定一个语言,定义它的文法的一种表示,并定义一个解释器。 **命令模式:** 将命令请求封装为一个对象,使得可以用不同的请求来进行参数化。 **责任链模式:** 将请求的发送者和接收者解耦,使的多个对象都有处理这个请求的机会。 | 设计原则 | Design principle | | ----------------- | ------------------------------------ | | `单例模式` | `Singleton Pattern` | | `工厂模式` | `Factory Pattern` | | `抽象工厂模式` | `Abstract Factory Pattern` | | `模板方法模式` | `Template Method Pattern` | | `建造者模式` | `Builder Pattern` | | `代理模式` | `Proxy Pattern` | | `原型模式` | `Prototype Pattern` | | `中介者模式` | `Mediator Pattern` | | `命令模式` | `Command Pattern` | | `责任链模式` | `Responsibility Chain Pattern` | | `装饰模式` | `Decorator Pattern` | | `策略模式` | `Strategy Pattern` | | `适配器模式` | `Adapter Pattern` | | `迭代器模式` | `Iterator Pattern` | | `组合模式` | `Combination Pattern` | | `观察者模式` | `Observer Pattern` | | `门面模式/外观模式` | `Facade Pattern` | | `备忘录模式` | `Memento Pattern` | | `访问者模式` | `Visitor Pattern` | | `状态模式` | `State Pattern` | | `解释器模式` | `Interpreter Pattern` | | `亨元模式` | `Flyweight Pattern` | | `桥梁模式` | `Bridge Pattern` | #### ## 设计模式 学习方法 [我的仓库](https://gitee.com/chenmit007/Design-pattern.git) 设计模式是软件开发中解决一类问题的通用方法。 使用设计模式能让你写出更优雅、可维护的代码,也正因如此,很多框架源码都用到了设计模式,面试也会考。 #### 知识 - 软件开发原则 - **创建型模式:对象实例化的模式,创建型模式用于解耦对象的实例化过程** - 单例模式【重点,多种实现方式】 - 工厂方法模式 - 抽象工厂 - 建造者模式 - 原型模式 - **结构型模式:把类或对象结合在一起形成一个更大的结构** - 适配器模式 - 组合模式 - **装饰器模式** - **代理模式** - 享元模式 - **外观模式** - 桥接模式 - **行为型模式:类和对象如何交互,及划分责任和算法** - 迭代器模式 - 模板方法模式 - 策略模式 - 命令模式 - 状态模式 - 责任链模式 - 备忘录模式 - 观察者模式 - 访问者模式 - 中介者模式 - 解释器模式 #### 学习建议 先理解概念,了解每个设计模式的特点和应用场景,再多加练习,运用到实际项目。 第一阶段:上面几种重点模式(重要😀)的了解他们的概念作用、使用地方、类和对象的关系 学习方法通过【视频+图解的书,也可以 [浏览菜鸟教程](https://www.runoob.com/design-pattern/design-pattern-tutorial.html)】 第二阶段:编码实现,手写上面几种常用模式,在Github搜索,也可以自己建立一个代码仓库。 第三阶段:在项目中使用,搜索设计模式在框架的应用和反问是否可以使用? #### 经典面试题 1. 介绍软件开发原则和设计模式分类优缺点; 2. 单例模式有哪些实现方式?有哪些优缺点?请手写其中一种 3. 你用过哪些设计模式,为什么用它? #### 资源 - 书籍 - ⭐《图解设计模式》(强烈推荐这本书,正是用 Java 语言实现,图多、有示例代码、有习题和答案,很不错) - 《大话设计模式》 - 视频 - 尚硅谷图解 Java 设计模式:https://www.bilibili.com/video/BV1G4411c7N4 - 文档 - 菜鸟教程:https://www.runoob.com/design-pattern/design-pattern-tutorial.html - 图说设计模式(从UML类图和时序图介绍的😃):https://design-patterns.readthedocs.io/zh_CN/latest/