{"id":19241663,"url":"https://github.com/qwqcode/designpatterns","last_synced_at":"2025-04-21T09:32:28.470Z","repository":{"id":54528891,"uuid":"450757523","full_name":"qwqcode/DesignPatterns","owner":"qwqcode","description":"✨ 设计模式学习笔记「附 TypeScript 版代码」【咕咕咕】","archived":false,"fork":false,"pushed_at":"2022-05-28T11:01:27.000Z","size":3284,"stargazers_count":12,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-01T12:03:44.932Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://qwqcode.github.io/DesignPatterns/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/qwqcode.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-01-22T08:16:27.000Z","updated_at":"2024-12-03T01:26:52.000Z","dependencies_parsed_at":"2022-08-13T18:50:18.078Z","dependency_job_id":null,"html_url":"https://github.com/qwqcode/DesignPatterns","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qwqcode%2FDesignPatterns","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qwqcode%2FDesignPatterns/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qwqcode%2FDesignPatterns/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qwqcode%2FDesignPatterns/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/qwqcode","download_url":"https://codeload.github.com/qwqcode/DesignPatterns/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250032146,"owners_count":21363780,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-09T17:12:10.450Z","updated_at":"2025-04-21T09:32:27.772Z","avatar_url":"https://github.com/qwqcode.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 设计模式\r\n\r\n[《研磨设计模式》](https://book.douban.com/subject/5343318/) 学习笔记 (by [@qwqcode](https://github.com/qwqcode))\r\n\r\n## 学习进度\r\n\r\n[得分/10] 敲代码+1 理论阅读+1 理论评论(大概理解)+2 项目实践+1 自我感觉良好+5\r\n\r\n1. [4] [简单工厂](./1_简单工厂.md)\r\n2. [4] [外观模式 (Facade)](./2_外观模式.md)\r\n3. [4] [适配器模式 (Adapter)](./3_适配器模式.md)\r\n4. [6] [单例模式 (Singleton)](./4_单例模式.md)\r\n5. [4] [工厂方法模式 (Factory Method)](./5_工厂方法模式.md)\r\n6. [4] [抽象工厂模式 (Abstract Factory)](./6_抽象工厂模式.md)\r\n7. [2] 生成器模式 (Builder)\r\n8. [2] 原型模式 (Prototype)\r\n9. [2] 中介者模式 (Mediator)\r\n10. [2] 代理模式 (Proxy)\r\n11. [2] 观察者模式 (Observer)\r\n12. [2] 命令模式 (Command)\r\n13. [2] 迭代器模式 (Iterator)\r\n14. [2] 组合模式 (Composite)\r\n15. [2] 模版方法模式 (Template Method)\r\n16. [2] 策略模式 (Strategy)\r\n17. [2] 状态模式 (State)\r\n18. [] 备忘录模式 (Memento)\r\n19. [2] 享元模式 (Flyweight)\r\n20. [] 解释器模式 (Interpreter)\r\n21. [] 装饰模式 (Decorator)\r\n22. [2] 职责链模式 (Chian of Responsibility)\r\n23. [2] 桥接模式 (Bridge)\r\n24. [] 访问者模式 (Visitor)\r\n\r\n## 扩展知识\r\n\r\n- 单例模式：\r\n  - [延迟加载的思想](./4_单例模式_2.md#延迟加载的思想)\r\n  - [缓存思想](./4_单例模式_2.md#缓存的思想)\r\n  - [时间和空间问题](./4_单例模式_2.md#单例模式的优缺点)\r\n  - [线程安全 (并发同步性能问题)](./4_单例模式_2.md#单例模式的优缺点)\r\n  - [双重检查加锁](./4_单例模式_2.md#单例模式的优缺点)\r\n  - [类级内部类](./4_单例模式_2.md#类级内部类（更好的方法）)\r\n  - [单例和枚举](./4_单例模式_2.md#单例和枚举（最佳方法）)\r\n- 工厂方法模式：\r\n  - [框架的基础知识](./5_工厂方法模式.md#框架的基础知识)\r\n  - [IoC/DI (控制反转/依赖注入)](./5_工厂方法模式_2.md#工厂方法模式与-iocdi)\r\n  - [平行的类层次结构](./5_工厂方法模式_2.md#平行的类层次结构)\r\n  - [依赖倒置原则 (设计原则)](./5_工厂方法模式_2.md#2-对设计原则的实现)\r\n- 抽象工厂模式：\r\n  - [DAO (数据访问对象)](./6_抽象工厂模式_2.md#抽象工厂模式和-DAO)\r\n  - [LDAP (轻型访问协议)](./6_抽象工厂模式_2.md#抽象工厂模式和-DAO)\r\n\r\n## 设计模式是什么？\r\n\r\n设计模式是指在软件开发中，经过验证的，用于解决在特定环境下、重复出现的、特定问题的解决方案。\r\n\r\n简而言之：设计方面的模版、设计的方式方法。\r\n\r\n- 设计模式是**解决方案**，解决问题的办法\r\n- 解决方案不一定是设计模式，设计模式前有一些定语\r\n    - 特定问题的：解决**特定问题**的解决方案才是设计模式\r\n        - 设计模式不是**灵丹妙药**\r\n        - 并不能解决所有问题，只能解决特定问题\r\n    - 特定情况的：在**特定情况**选择合适的**设计模式**\r\n        - 不要滥用，不要迷信\r\n        - 设计模式是**待定问题**的解决方案\r\n    - 重复出现的：设计模式是**重复出现**的解决方案\r\n        - 前人总结的好办法\r\n    - 特定环境的：设计模式是在**特定环境**下的解决方案\r\n        - 不能脱离环境去讨论对问题的解决办法\r\n        - 不同环境下但相同问题，解决方案不相同\r\n    - 经过验证的：设计模式是**经过验证**的解决方案\r\n        - 只有**经过验证**的解决方案才算得上设计模式\r\n    - 软件开发中的：仅讨论在软件开发方面的设计模式\r\n        - 事实上，很多行业也有自己的设计模式\r\n\r\n总结：设计模式是在**特定问题**、**特定情况**和**特定环境**下**经过验证**的解决方案（模版）。\r\n\r\n## 设计模式的一些理解\r\n\r\n- 设计模式不是凭空想出来的，是经验的积累和总结\r\n- 设计模式是相对优秀的，没有最优，只有更优（对于特定问题）\r\n- 设计模式一直在发展，需要讨论学习经典设计模式\r\n- 我们自己也能总结解决方案，如果得到了大家的认可和验证，也有可能成为公认的设计模式\r\n- 设计模式不是软件行业独有，各行各业都有设计模式（例如药品监管）\r\n\r\n## 学习设计模式\r\n\r\n理解掌握设计模式重心在于：\r\n\r\n1. 对这些方法的理解和掌握\r\n2. 然后进一步深化到这些方法所体现的思想上\r\n3. 将设计模式所体现的思考方式进行吸收和消化\r\n4. 融入到自己的思维中\r\n\r\n### 学设计模式有何用处？\r\n\r\n1. 设计模式成为软件开发人员的 \"标准词汇\"（交流所需）\r\n    - 交流中像汉语成语一样使用\r\n    - 说设计模式的名称知道思想\r\n    - 一个合格的软件开发人员，必须掌握设计模式这个标准词汇\r\n2. 学习设计模式是个人技术提高的途径\r\n    - 站在巨人的肩膀上：前人积累的经验\r\n    - 吸收领会前人的设计思想\r\n    - 掌握前人解决问题的方法\r\n    - 让自己技术提升\r\n3. 不重复发明轮子\r\n    - 设计模式对于特定问题能很好的解决，面对这些问题能快速解决\r\n    - 节约大量研究时间，把时间花在其他问题上\r\n\r\n### 学习设计模式的层次\r\n\r\n1. 基本入门级\r\n    - 正确理解和掌握设计模式的基本知识\r\n    - 能够识别在什么场景下、出现了什么问题、采用何种方案来解决它\r\n    - 能够在实际程序设计和开发中套用相应的设计模式\r\n2. 基本掌握级\r\n    - 具备基本的要求外，还能结合实际应用场景，对设计模式变形使用\r\n    - 很多场景不一样的情况，适当变形，而不是僵硬套用\r\n    - 进行变形前提是要能准确深入地理解和把握设计模式的本质\r\n    - 万变不离其宗，只有把握本质，才能确保正确变形而不是误用\r\n3. 深入理解和掌握级\r\n    - 除了具备基本掌握级别外，更主要的是：\r\n        - 从思想和方法上吸收设计模式的精髓，并融入到自己的思路中\r\n        - 在进行软件的分析和设计的时候，能随意地、自然而然地应用，就如同自己思维的一部分\r\n        - 深入考虑：除了设计模式外，考虑系统整体地结构、实际功能的实现、与已有功能的结合。在应用设计模式时，不拘泥于设计模式本身，而是从思想和方法层面进行应用\r\n\r\n简而言之，基本入门套用使用，基本掌握灵活运用、适当变形，深入理解掌握才算真正将设计模式精髓吸收，从思想和方法层面去理解和掌握设计模式，就犹如练习武功到达最高境界，“无招胜有招”。要想达到这个境界，需要足够的开发经验和设计经验，没有足够深入的思考不太可能达到。\r\n\r\n设计模式觉得懂了，实际运用还是不会。认为设计模式是 \"看上去很美\" 的 \"花拳绣腿\"，其实他们正处于 \"设计模式的了解级别\"，根本没有入门。\r\n\r\n### 如何学习设计模式？\r\n\r\n- 心态：不要指望设计模式简单有趣，一看就懂（一看就懂属于科普性质的书）\r\n- 思考：看了过后思考，应用，再看，再思考，循环反复\r\n- 理论指导实践，实践反过来加深对理论的理解\r\n- 反复思考，反复实践\r\n\r\n学习步骤：\r\n\r\n- 第一步：准确理解设计模式功能、基本结构、标准实现，了解适合它的场景及使用效果\r\n- 第二步：实际开发中，尝试使用这些设计模式，并反复思考和总结是否使用得当，是否需要做一些变化\r\n- 第三步：回头看设计模式的理论，有了实践再回头看会有不同感悟，一边看一边根据实践经验思考：设计模式的本质功能是什么？如何实现的？这些实现方式还可以在什么地方应用？如何才能把这个设计模式和具体应用结合起来？设计模式的出发点是什么？\r\n- 第四步：重复二三步。实践后再思考，循环反复，直到达到设计模式基本掌握水平\r\n\r\n实际上，最后达到高度因人而异，需要看个人思维水平和理解水平。\r\n\r\n建议是：反复地、深入地思考，别无他法。到了思想层面，就得靠 \"悟\" 了。\r\n\r\n就我个人而言，为什么要学习设计模式？因为在项目实践过程中，很多代码的写法 (组织方式) 很好，我逐渐意识到这些方式方法就是我需要学习的「设计模式」","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fqwqcode%2Fdesignpatterns","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fqwqcode%2Fdesignpatterns","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fqwqcode%2Fdesignpatterns/lists"}