Gof的23种设计模式
UML-GoF设计模式

UML-GoF设计模式我认为,本章是重点中的重点。
并⾮23个模式都被⼴泛应⽤,其中常⽤和最为有效的⼤概有15个模式。
1、适配器(Adapter)1)、使⽤场景使⽤⼀个已经存在的类,但如果他的接⼝,也就是他的⽅法和你的要求不相同时,考虑使⽤是适配器模式。
就是说,双⽅都不修改⾃⼰的代码的时候,可以采⽤适配器模式。
2)、结构图3)、相关模式外观对象:隐藏外部系统的资源适配器也被视为外观对象,因为资源适配器使⽤单⼀对象封装了对⼦系统或系统的访问。
资源适配器:当包装对象时为不同外部接⼝提供适配时,该对象叫资源适配器4)、准则类名后缀为“Adapter”。
5)、⽤到的GRASP原则2、⼯⼚模式1)、使⽤场景该模式也常称为“简单⼯⼚”或“具体⼯⼚”。
如:1)、存在复杂创建逻辑2)、为提⾼内聚⽽分离创建者职责(关注点分离)因此,创建称为⼯⼚的纯虚构对象来处理这些创建职责。
2)、结构⼀般xxxFactory应该是单实例类。
3)、相关模式通常使⽤单例模式来访问⼯⼚模式。
由谁创建⼯⼚呢?⼀般采⽤单例模式。
3、单例模式1)、使⽤场景只有唯⼀实例的类即为“单实例类”。
对象需要全局可见性和单点访问。
因此,建议对类定义静态⽅法⽤以返回单实例。
2)、相关模式单例模式:通常⽤于创建⼯⼚对象和外观对象以上整合例⼦:4、策略模式1)、使⽤场景销售的定价策略(也可叫做规则、政策或算法)具有多样性。
在⼀段时间内,对于所有的销售可能会有10%的折扣,后期可能会对超出200元的销售给予10%的折扣,并且还会存在其他⼤量的变化。
因此,在单独的类中分别定义每种策略/规则/政策/算法,并且使其具有共同接⼝。
2 )、结构策略模式,共同的⽅法内传⼊的参数,通常是上下⽂对象,上图就是sale。
3)、结合⼯⼚模式1)、使⽤⼯⼚模式创建这些策略类2)、使⽤单例模式创建⼯⼚类。
5、组合模式1)、使⽤场景如果有重叠怎么办?⽐如:1)⽼年⼈折扣20%2)购物⾦额满200元享受15%折扣因此,如何能够处理像原⼦对象⼀样,(多态的)处理⼀组对象或具有组合结构的对象呢?答:定义组合和原⼦对象的类,使他们具有相同的接⼝。
GOF以及JAVA的23种设计模式简介

GOF以及java的23种设计模式简介GoF:(Gang of Four,GOF设计模式)---四人组Design Patterns:Elements of Reusable Object-Oriented Software(即后述《设计模式》一书),由Erich Gamma、Richard Helm、Ralph Johnson 和John Vlissides合著(Addison-Wesley,1995)。
这几位作者常被称为"四人组(Gang of Four)",而这本书也就被称为"四人组(或GoF)"书。
Design Patterns:Elements of Reusable Object-Oriented Software(即后述《设计模式》一书),由Erich Gamma、Richard Helm、Ralph Johnson 和John Vlissides合著(Addison-Wesley,1995)。
这几位作者常被称为“四人组(Gang of Four)”,而这本书也就被称为“四人组(或GoF)”书。
在《设计模式》这本书的最大部分是一个目录,该目录列举并描述了23种设计模式。
另外,近来这一清单又增加了一些类别,最重要的是使涵盖范围扩展到更具体的问题类型。
例如,Mark Grand在Patterns in Java:A Catalog of Reusable Design Patterns Illustrated with UML(即后述《模式Java版》一书)中增加了解决涉及诸如并发等问题的模式,而由Deepak Alur、John Crupi和Dan Malks合著的Core J2EE Patterns:Best Practices and Design Strategies一书中主要关注使用Java2企业技术的多层应用程序上的模式。
对软件设计模式的研究造就了一本可能是面向对象设计方面最有影响的书籍:《设计模式》。
GOF_23种设计模式

创建型模式1、FACTORY2、BUILDER3、FACTORY METHOD4、PROTOTYPE5、SINGLETON结构型模式6、ADAPTER7、BRIDGE8、COMPOSITE9、DECORATOR10、FAÇADE11、FLYWEIGHT12、PROXY行为模式13、CHAIN OF RESPONSIBLEITY14、COMMAND15、INTERPRETER16、ITERATOR17、MEDIATOR18、MEMENTO19、OBSERVER20、STATE21、STRATEGY22、TEMPLATE METHOD23、VISITOR创建型模式1、FACTORY追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说“来四个鸡翅”就行了。
麦当劳和肯德基就是生产鸡翅的Factory工厂模式:客户类和工厂类分开。
消费者任何时候需要某种产品,只需向工厂请求即可。
消费者无须修改就可以接纳新产品。
缺点是当产品修改时,工厂类也要做相应的修改。
如:如何创建及如何向客户端提供。
2、BUILDERMM最爱听的就是“我爱你”这句话了,见到不同地方的MM,要能够用她们的方言跟她说这句话哦,我有一个多种语言翻译机,上面每种语言都有一个按键,见到MM我只要按对应的键,它就能够用相应的语言说出“我爱你”这句话了,国外的MM也可以轻松搞掂,这就是我的“我爱你”builder。
(这一定比美军在伊拉克用的翻译机好卖)建造模式:将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部表象的产品对象。
建造模式使得产品内部表象可以独立的变化,客户不必知道产品内部组成的细节。
建造模式可以强制实行一种分步骤进行的建造过程。
3、FACTORY METHOD请MM去麦当劳吃汉堡,不同的MM有不同的口味,要每个都记住是一件烦人的事情,我一般采用Factory Method模式,带着MM到服务员那儿,说“要一个汉堡”,具体要什么样的汉堡呢,让MM直接跟服务员说就行了。
GOF的23种设计模式

GOF的23种设计模式一、创建型模式Abstract Factory:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
Builder:将一个复杂对象的构件与它的表示分离,使得同样的构建过程可以创建不同的表述。
Factory Method:定义一个用于创建对象的接口,让子类决定将哪一个类实例化。
Factory Method使一个类的实例化延迟到其子类。
Prototype:用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象。
Singleton:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
二、结构型模式Adapter:将一个类的接口转换成客户希望的另外一个接口。
Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
Bridge:将抽象部分与它的实现部分分离,使它们都可以独立地变化。
Composite:将对象组合成树型结构以表示“部分-整体”的层次结构。
Composite使得客户对单个对象和复合对象的使用具有一致性。
Decorator:动态地给一个对象添加一些额外的职责。
就扩展功能而言,Decorator模式比生成子类方式更为灵活。
Facade:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
Flyweight:运用共享技术有效地支持大量细粒度的对象。
Proxy:为其他对象提供一个代理以控制对这个对象的访问。
三、行为型模式Chain of Responsibility:为解除请求的发送者和接受者之间耦合,而使多个对象都有机会处理这个请求。
将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。
Command:将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。
Interpreter:给定一个语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。
Java设计模式之GOF23全面讲解

Java设计模式之GOF23全⾯讲解⼀、什么是设计模式设计模式(Design pattern)是解决软件开发某些特定问题⽽提出的⼀些解决⽅案也可以理解成解决问题的⼀些思路。
通过设计模式可以帮助我们增强代码的可重⽤性、可扩充性、可维护性、灵活性好。
我们使⽤设计模式最终的⽬的是实现代码的⾼内聚和低耦合。
⼆、设计模式的三⼤分类及关键点1、创建型模式对象实例化的模式,创建型模式⽤于解耦对象的实例化过程。
单例模式:某个类智能有⼀个实例,提供⼀个全局的访问点。
⼯⼚模式:⼀个⼯⼚类根据传⼊的参量决定创建出哪⼀种产品类的实例。
抽象⼯⼚模式:创建相关或依赖对象的家族,⽽⽆需明确指定具体类。
建造者模式:封装⼀个复杂对象的创建过程,并可以按步骤构造。
原型模式:通过复制现有的实例来创建新的实例。
2、结构型模式把类或对象结合在⼀起形成⼀个更⼤的结构。
装饰器模式:动态的给对象添加新的功能。
代理模式:为其它对象提供⼀个代理以便控制这个对象的访问。
桥接模式:将抽象部分和它的实现部分分离,使它们都可以独⽴的变化。
适配器模式:将⼀个类的⽅法接⼝转换成客户希望的另⼀个接⼝。
组合模式:将对象组合成树形结构以表⽰“部分-整体”的层次结构。
外观模式:对外提供⼀个统⼀的⽅法,来访问⼦系统中的⼀群接⼝。
享元模式:通过共享技术来有效的⽀持⼤量细粒度的对象。
3、⾏为型模式类和对象如何交互,及划分责任和算法。
策略模式:定义⼀系列算法,把他们封装起来,并且使它们可以相互替换。
模板模式:定义⼀个算法结构,⽽将⼀些步骤延迟到⼦类实现。
命令模式:将命令请求封装为⼀个对象,使得可以⽤不同的请求来进⾏参数化。
迭代器模式:⼀种遍历访问聚合对象中各个元素的⽅法,不暴露该对象的内部结构。
观察者模式:对象间的⼀对多的依赖关系。
仲裁者模式:⽤⼀个中介对象来封装⼀系列的对象交互。
备忘录模式:在不破坏封装的前提下,保持对象的内部状态。
解释器模式:给定⼀个语⾔,定义它的⽂法的⼀种表⽰,并定义⼀个解释器。
面向对象设计的23个设计模式详解

面向对象设计的23个设计模式详解面向对象设计是一种广泛应用于软件开发的思想,其核心在于将数据和操作封装在一起形成对象,并通过各种方式进行交互和组合,从而实现复杂的功能。
在这一过程中,设计模式起到了非常重要的作用,可以有效地提高代码的可读性、可维护性和可扩展性。
本文将对23种常见的设计模式进行详解。
一、创建型模式1.简单工厂模式简单工厂模式属于创建型模式,其目的是提供一个工厂类,使得创建对象的过程更加简单。
在这种模式中,使用者只需要提供所需对象的参数,而无需关心对象的具体实现细节。
简单工厂模式适合于对象创建过程较为简单的情况。
2.工厂方法模式工厂方法模式是简单工厂模式的进一步扩展,其核心在于将工厂类进行接口抽象化,使得不同的工厂类可以创建不同的对象实例。
工厂方法模式适合于对象创建过程较为复杂的情况。
它可以为工厂类添加新的产品类型,而不会影响原有的代码。
3.抽象工厂模式抽象工厂模式是工厂方法模式的进一步扩展,其目的是提供一个可以创建一系列相关或者独立的对象的接口。
在抽象工厂模式中,使用者只需要关心所需对象组合的类型,而无需关注对象的具体实现过程。
4.建造者模式建造者模式也是一种创建型模式,其目的在于将复杂对象分解为多个简单的部分,并将其组装起来形成复杂对象实例。
在建造者模式中,使用者只需要关注所需对象以及它们的组合方式,而无需关心对象的具体实现过程。
5.原型模式原型模式是一种基于克隆的创建型模式,其核心在于通过复制现有的对象实例来创建新的对象。
在原型模式中,对象实例的创建过程与对象所包含的状态密切相关。
原型模式适合于创建复杂对象实例,且这些对象实例之间是相对独立的情况。
二、结构型模式6.适配器模式适配器模式是一种结构型模式,其目的在于将一个类的接口转换为另一个类所能使用的接口。
在适配器模式中,使用者可以通过不同的适配器实现对象之间的互相调用。
7.桥接模式桥接模式是一种结构型模式,其目的在于将抽象部分与实现部分相互分离,从而使得两者可以独立变化。
23种设计模式记忆口诀

23种设计模式记忆口诀
1.单例模式:唯一实例化,静态访问,线程不安全
2. 工厂方法模式:子类实现,工厂创建,扩展性强
3. 抽象工厂模式:创建一族产品,接口约束,扩展性强
4. 建造者模式:组合复杂对象,分步骤构建,灵活性高
5. 原型模式:克隆对象,避免重复创建,效率高
6. 适配器模式:兼容接口不同,类似转换器,易扩展
7. 桥接模式:抽象与实现分离,解耦合,易扩展
8. 装饰器模式:动态增强对象功能,不影响原有对象,易扩展
9. 组合模式:层次结构,统一访问,易扩展
10. 外观模式:简化复杂系统调用,易使用,易扩展
11. 享元模式:共享资源,避免重复创建,效率高
12. 代理模式:增强对象功能,控制对象访问,易扩展
13. 责任链模式:多个对象处理请求,自动传递,易扩展
14. 命令模式:将请求封装成对象,易扩展,易记录日志
15. 解释器模式:解释语言,易扩展,易维护
16. 迭代器模式:遍历集合,统一访问,易扩展
17. 中介者模式:分离对象间交互,降低耦合,易扩展
18. 观察者模式:对象状态改变,通知观察者,易扩展
19. 备忘录模式:保存对象状态,易恢复,易扩展
20. 状态模式:对象状态改变,自动改变行为,易扩展
21. 策略模式:选择不同策略,易切换,易扩展
22. 模板方法模式:定义操作流程,易扩展,易维护
23. 访问者模式:统一访问集合中对象,易扩展,易维护。
gof 23 种设计模式解析附 c语言

gof 23 种设计模式解析附 c语言在计算机科学中,设计模式(Design Patterns)是一套被反复使用的,多数人知道的,经过分类编目的,代码设计经验的总结。
使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。
GoF 23种设计模式是设计模式中最经典和最常用的部分,这些模式主要用于解决特定类型的问题。
下面是这些设计模式的C语言解析:1. 工厂方法模式(Factory Method Pattern)```c#include <stdio.h>// 抽象产品类struct AbstractProduct {void use() {printf("AbstractProduct\n");}};// 具体产品类1struct ConcreteProduct1 : public AbstractProduct { void use() {printf("ConcreteProduct1\n");}};// 具体产品类2struct ConcreteProduct2 : public AbstractProduct { void use() {printf("ConcreteProduct2\n");}};// 抽象工厂类struct AbstractFactory {virtual AbstractProduct* createProduct() = 0; };// 具体工厂类1struct ConcreteFactory1 : public AbstractFactory {AbstractProduct* createProduct() {return new ConcreteProduct1;}};// 具体工厂类2struct ConcreteFactory2 : public AbstractFactory {AbstractProduct* createProduct() {return new ConcreteProduct2;}};int main() {ConcreteFactory1 factory1;ConcreteProduct1* product1 = factory1.createProduct(); product1->use(); // 输出 "ConcreteProduct1"delete product1; // 释放内存factory1.createProduct(); // 空指针异常,因为工厂已不再生产任何产品return 0;}```。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Gof的23种设计模式
从2005年初听说设计模式,到现在虽然已经8年多了,但GoF的23种模式依然盛行,当然GoF提出这些模式的
年代更加久远(1995年)。
在工作的过程中,陆陆续续接触了GoF的大部分模式,我记得在2008年的时候就想总结一下设计模式(最近想做的两件事情),最后因为各种原
因也没有完成。
最近这段时间正好是职业空档期,没什么事儿做,就把之前看过的设计模式翻出来整理了一下,于是就有了上面几篇文章。
整理设计模式的过程,也是一个深刻理解面向对象设计的过程。
通过对各个模式的回顾,让我更能够明白前辈们关于面向对象设计提出的各种“最佳实践”,特别是S.O.L.I.D,我觉得在这里再说一次,也不算矫情。
S:单一职责原则(Single Responsibility Principle, SRP),一个类只能有一个原因使其发生改变,即一个类只承担一个职责。
O:开放-封闭原则(Open-Close Principle, OCP),这里指我们的设计应该针对扩展开放,针对修改关闭,即尽量以扩展的方式来维护系统。
L:里氏替换原则(Liskov Subsititution Principle, LSP),它表示我们可以在代码中使用任意子类来替代父类并且程
序不受影响,这样可以保证我们使用“继承”并没有破坏父类。
I:接口隔离原则(Interface Segregation Principle, ISP),客户端不应该依赖于它不需要的接口,两个类之间的依赖应该建立在最小接口的基础上。
这条原则的目的是为了让那些使用相同接口的类只需要实现特定必要的一组方法,而不是大量没用的方法。
D:依赖倒置原则(Dependence Inversion Principle, DIP),高层模块不应该依赖于低层模块,两者应该都依赖于抽象;抽象不依赖于细节,而细节应该依赖于抽象。
这里主要是提倡“面向接口”编程,而非“面向实现”编程。
设计模式,从本质上讲,是针对过去某种经验的总结。
每种设计模式,都是为了在特定条件下去解决特定问题,离开这些前提去讨论设计模式,是没有意义的。
下面,我们快速回顾GoF的23种模式。
工厂方法
意图:定义一个用户创建对象的接口,让子类去决定具体使用哪个类。
适用场合:1)类不知道它所要创建的对象的类信息;2)类希望由它的子类来创建对象。
抽象工厂
意图:提供一个创建一系列相关或者相互依赖的对象的接口,而无须指定它的具体实现类。
适用场合:1)系统不依赖于产品是如何实现的细节;2)系统的产品族大于1,而在运行时刻只需要某一种产品族;3)属于同一个产品族的产品,必须绑在一起使用;4)所有的
产品族,可以抽取公共接口单例
意图:保证一个类只有一个实例,并且在系统全局范围内提供访问切入点。
适用场合:各种“工厂类”构造者
意图:将复杂对象的构造与表示相分离,使得同样的构造过程可以产生不同的复杂对象。
适用场合:1)需要创建的对象有复杂的内部结构;2)对象的属性之间相互依赖,创建时前后顺序需要指定。
原型
意图:用原型实例指定创建对象的种类,并通过复制原型实例得到对象。
适用场合:1)系统不关心对象创建的细节;2)要实例化的对象的类型是动态加载的;3)类在运行过程中的状态是有限的。
适配器
意图:将一个类的接口转换成用户希望的另一个接口。
适用场合:系统需要使用现有类的功能,但接口不匹配装饰意图:动态的为对象添加额外职责
适用场合:1)需要添加对象职责;2)这些职责可以动态添加或者取消;3)添加的职责很多,从而不能用继承实现。
桥接器
意图:将抽象部分与实现部分分离,从而使得它们可以独立变化
适用场合:1)系统需要在组件的抽象化角色与具体化角色
之间增加更多的灵活;2)角色的任何变化都不应该影响客户端;3)组件有多个抽象化角色和具体化角色享元
意图:运用共享技术支持大量细粒度的对象
适用场合:1)系统中有大量对象;2)这些对象占据大量内存;3)对象中的状态可以很好的区分为外部和内部;4)可以按照内部状态将对象分为不同的组;5)对系统来讲,同一个组内的对象是不可分辨的门面
意图:为系统的一组接口提供一个一致的界面
适用场合:1)为一个复杂的接口提供一个简单界面;2)保持不同子系统的独立性;3)在分层设计中,定义每一层的入口合成
意图:将对象组装成树状结构以表示“部分-整体”的关系
适用场合:1)系统中的对象之间是“部分-整体”的关系;2)用户不关心“部分”与“整体”之间的区别代理
意图:为其他对象提供一种代理以控制对该对象的访问
适用场合:对象无法直接访问(远程代理)职责链
意图:对目标对象实施一系列的操作,并且不希望调用双方和操作之间有耦合关系
适用场合:1)输入对象需要经过一系列处理;2)这些处理需要在运行时指定;3)需要向多个操作发送处理请求;4)这些处理的顺序是可变的命令
意图:对一类对象公共操作的抽象
适用场合:1)调用者同时和多个执行对象交互;2)需要控制调用本身的生命周期;3)调用可以取消观察者
意图:定义对象之间一种“一对多”的关系,当一个对象发生改变时,所有和它有依赖关系的对象都会得到通知
适用场合:1)抽象模型有两部分,其中一部分依赖于另一部分;2)一个对象的改变会导致其他很多对象发生改变;3)对象之间是松耦合访问者
意图:对一组不同类型的元素进行处理
适用场合:1)一个类型需要依赖于多个不同接口的类型;2)需要经常为一个结构相对稳定的对象添加新操作;3)需要用一个独立的类型来组织一批不相干的操作,使用它的类型可以根据应用需要进行定制模板
意图:定义一个操作步骤的方法骨架,而将其中一些细节的实现放到子类中
适用场合:1)可以抽取方法骨架;2)控制子类的行为,只需要实现特定细节策略
意图:对算法族进行封装
适用场合:1)完成某项业务有多个算法;2)算法可提取公共接口解释器
意图:应用或对象与用户狡猾时,采取最具实效性的方式完成
适用场合:1)针对对象的操作有规律可循;2)在执行过程
中,对效率要求不高,但对灵活性要求很高迭代
意图:提供一种方法,来顺序访问集合中的所有元素
适用场合:1)访问一个聚合对象的内容,而不必暴露其内部实现;2)支持对聚合对象的多种遍历方式;3)为遍历不同的聚合对象提供一致的接口中介者
意图:避免大量对象之间的紧耦合
适用场合:1)有大量对象彼此依赖(M:N);2)某个类型要依赖于很多其他类型备忘录
意图:希望备份或者恢复复杂对象的部分属性
适用场合:1)对象的属性比较多,但需要备份恢复的属性比较少;2)对象的状态是支持恢复的状态
意图:管理对象的多个状态
适用场合:1)对象的行为依赖于当前状态;2)业务处理过程存在多个分支,而且分支会越来越多。