chapter09_GoF设计模式_结构型模式3
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设计模式研究
面向对象程序设计中的GOF设计模式研究在现代软件开发中,面向对象编程是一种非常流行的编程范式,它把现实世界中的事物看作是对象,并且把这些对象组合成一个完整的系统。
GOF设计模式是一种基于面向对象编程思想的软件设计模式,它帮助程序员更好地组织软件架构,提高代码的可维护性和可扩展性。
本文将探讨GOF设计模式在面向对象程序设计中的运用及优势。
一、GOF设计模式是什么?GOF是四位著名的软件工程师Erich Gamma,Richard Helm,Ralph Johnson和John Vlissides的姓氏的首字母缩写,他们在1995年发表了一本名为《设计模式:可重用面向对象软件的基础》的书。
这本书是软件行业中重要的著作之一,其中提供了23种常用的设计模式。
GOF设计模式是一种面向对象编程思想的软件设计模式,它是建立在OOP思想基础上的。
GOF设计模式为软件开发人员提供了一种通用的解决方案,以解决不同类型的问题。
这些模式通常被分类为三类:创建型,结构型和行为型。
二、GOF设计模式的分类及用途1、创建型设计模式创建型设计模式是用来解决创建对象的问题。
例如,如何创建对象,以及何时和如何初始化对象。
共有五种创建型模式,分别是:单例模式(Singleton Pattern):保证一个类仅有一个实例,并提供一个访问它的全局访问点。
工厂模式(Factory Pattern):为创建对象定义一个接口,但由子类决定要实例化的类是哪一个。
工厂方法让类把实例化推迟到子类。
抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并且通过拷贝这些原型来创建新的对象。
建造者模式(Builder Pattern):将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。
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:给定一个语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。
设计模式——结构型模式(包含7种)
设计模式——结构型模式(包含7种)结构型设计模式是从程序的结构上解决模块之间的耦合问题。
包括以下七种模式:1.Adapte适配器模式:Adapter模式通过类的继承或者对象的组合侧重于转换已有的接⼝,类适配器采⽤“多继承”的实现⽅式,带来了不良的⾼耦合,所以⼀般不推荐使⽤。
对象适配器采⽤“对象组合”的⽅式,更符合松耦合精神。
例如:笔记本电源适配器,可以将220v转化为适合笔记本使⽤的电压。
2.Bridge桥接模式:将抽象部分与实现部分分离,使它们都可以独⽴的变化。
减少因变化带来的代码的修改量。
例如:经典例⼦,电灯开关,开关的⽬的是将设备打开或关闭,产⽣的效果不同。
posite组合模式:将对象组合成树形结构以表⽰“部分-整体”的层次结构。
Composite模式使得客户对单个对象和组合对象的使⽤具有⼀致性。
从⽽解决了解决客户程序与复杂对象容器的解耦,即:通过继承统⼀的接⼝,我们可以将容器对象及其⼦对象看成同⼀类对象使⽤,以减少对象使⽤中的复杂度。
例如:让⽤户⼀致地使⽤单个对象和组合对象,1+2和(1+1)+(2*3)都是合法的表达式。
单个与整体都可以进⾏加法运算符的操作。
4.Decorator装饰模式:动态地给⼀个对象添加⼀些额外的职责。
就增加功能来说,Decorator模式相⽐⽣成⼦类更为灵活。
[GOF 《设计模式》]Decorator模式采⽤对象组合⽽⾮继承的⼿法,实现了在运⾏时动态的扩展对象功能的能⼒,⽽且可以根据需要扩展多个功能,避免了单独使⽤继承带来的“灵活性差”和“多⼦类衍⽣问题”。
同时它很好地符合⾯向对象设计原则中“优先使⽤对象组合⽽⾮继承”和“开放-封闭”原则。
例如:⼀幅画,可以直接挂到墙上,也可以加上框架和镶上玻璃后,再挂到墙上。
5.Facade外观模式:为⼦系统中的⼀组接⼝提供⼀个⼀致的界⾯,简化接⼝。
例如:我们拨打10086,可以办理,彩铃,⼿机报,全时通等业务(⼦对象),⽽10086则是为⼦对象所使⽤的⼀致界⾯。
结构型模式
实现要点
1.Adapter模式主要应用于“希望复用一些现存的类,但是接口 又与复用环境要求不一致的情况”,在遗留代码复用、类库迁移等 方面非常有用。 2.Adapter模式有对象适配器和类适配器两种形式的实现结构,但 是类适配器采用“多继承”的实现方式,带来了不良的高耦合,所 以一般不推荐使用。对象适配器采用“对象组合”的方式,更符合 松耦合精神。 3.Adapter模式的实现可以非常的灵活,不必拘泥于GOF23中定 义的两种结构。例如,完全可以将Adapter模式中的“现存对象” 作为新的接口方法参数,来达到适配的目的。 4.Adapter模式本身要求我们尽可能地使用“面向接口的编程”风 格,这样才能在后期很方便的适配。[以上几点引用自MSDN WebCast]
将一个类的接口转换成客户希望的另外 一个接口。Adapter模式使得原本由于接口 不兼容而不能一起工作的那些类可以一起工 作。 --《设计模式》GOF
结构图(Structure)
生活案例
扳手提供了一个适配器的例子。一个孔 套在棘齿上,棘齿的每个边的尺寸是相同的。 在美国典型的边长为1/2''和1/4''。显然, 如果不使用一个适配器的话,1/2''的棘齿不 能适合1/4''的孔。一个1/2''至1/4''的适配 器具有一个1/2''的阴槽来套上一个1/2''的 齿,同时有一个1/4的阳槽来卡入1/4''的扳 手。
代码演示(Code in .Net)
.NET中的应用
NET中的Adapter模式的应用就是DataAdapter。 为统一的数据访问提供了多个接口和基 类,其中最重要的接口之一是IdataAdapter。与 之相对应的DataAdpter是一个抽象类,它是 与具体数据库操作之间的数据适配器的 基类。DataAdpter起到了数据库到DataSet桥接 器的作用,使应用程序的数据操作统一到DataSet 上,而与具体的数据库类型无关。甚至可以针对特 殊的数据源编制自己的DataAdpter,从而使我们 的应用程序与这些特殊的数据源相兼容。注意这是 一个适配器的变体。
软件设计模式之结构型模式
适用场景
01
02
03
需要动态地添加或删除 功能的情况。
需要灵活地组合和复用 功能的情况。
需要对原有对象进行扩 展,但不希望修改原有
对象代码的情况。
实现方式
定义一个抽象组件接口,规定组件的基本功能。
输标02入题
定义一个具体组件类,实现抽象组件接口,提供具体 功能。
01
03
定义具体装饰器类,继承装饰器抽象类,并实现其方 法。在具体装饰器类中,可以调用被装饰对象的方法,
提高了系统的可扩展性和可复用性。
特点
分离抽象和实现,使它们可以独立变化 。
适用场景
1
当一个类需要同时访问多个接口时,且这些接口 之间存在继承关系。
2
当一个类需要同时访问多个接口,且这些接口之 间存在依赖关系时。
3
当一个类需要同时访问多个接口,且这些接口之 间存在关联关系时。
实现方式
创建抽象接口
定义抽象接口,用于规定具体类的行为。
05
02
桥接模式
将抽象与实现解耦,使它们可以独立变化。
04
装饰器模式
动态地给一个对象添加一些额外的职 责,就增加功能来说,装饰器模式相 比生成子类更为灵活。
06
享元模式
通过共享对象来显著减少系统中对象的数量, 从而显著提高系统性能。
02 适配器模式
定义与特点
01
02
定义:适配器模式是一 种结构型设计模式,它 通过将一个类的接口转 换成客户端所期望的另 一个接口,使得原本由 于接口不兼容而无法协 同工作的类能够一起工 作。
实现步骤
1. 定义抽象组件接口,包括在接口中声明需要 在组合中使用的操作。
2. 创建实现抽象组件接口的叶子节点类和复合 组件类。
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;}```。
.netgof23种设计模式
.netgof23种设计模式⼀、设计模式的分类GOF⼀共总结了23套设计模式,⼤致可以分为以下三类:创造型模式这些设计模式提供了⼀种在创建对象的同时隐藏创建逻辑的⽅式,⽽不是使⽤ new 运算符直接实例化对象。
这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活,该类型包括:单件模式、抽象⼯⼚、建造者模式、⼯⼚⽅法模式和原型模式等5种。
结构型模式这些设计模式关注类和对象的组合。
继承的概念被⽤来组合接⼝和定义组合对象获得新功能的⽅式,该类型包括:适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式和代理模式等7种。
⾏为型模式这些设计模式特别关注对象之间的通信。
分为职责链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板⽅法、访问者模式等11种。
⼆、设计模式解析常⽤设计模式浅析:1、单件模式结构图:意图:保证⼀个类仅有⼀个实例,并提供⼀个访问它的全局访问点。
适⽤性:当类只能有⼀个实例⽽且客户可以从⼀个众所周知的访问点访问它时。
当这个唯⼀实例应该是通过⼦类化可扩展的,并且客户应该⽆需更改代码就能使⽤⼀个扩展的实例时。
⽰意性代码:1//单件模式⽰意性代码2public class Singleton3 {4//创建私有对象,保证只有⼀个对象5private static Singleton _instance;67//保护类型的构造函数,⼦类化可扩展8protected Singleton() { }910//提供公共访问点11public static Singleton Instance()12 {1314// 使⽤ 'Lazy initialization',为对象实例化15if (_instance == null)16 {17 _instance = new Singleton();18 }1920return _instance;21 }22 }Singleton特点总结:实例对外唯⼀、⼦类可以扩展并且提供⼀个公共的访问点访问。
设计模式系列之一:23种GoF设计模式概述
设计模式系列之一:23种GoF设计模式概述23种GoF设计模式概述在前面,我们对 GoF 的 23 种设计模式进行了分类,这里先对各个设计模式的功能进行简要介绍,以便有个大概了解。
后面的章节再进行详细介绍。
创建型模式关注于怎么创建对象的创建型模式,他们将对象的创建与使用相互分离,对象的使用者无需关心如何创建对象,只知道怎么使用就行,以降低耦合度。
犹如汽车使用人无需关注汽车是怎么造出来一样,只要知道怎么使用就行。
下面这5种模式就是属于这一类。
•单例(Singleton)模式:控制某个类只能自行生成一个可供外部全局访问的实例。
例如:Windows的窗口管理器或者任务管理器都是只有一个实例。
•原型(Prototype)模式:将一个创建成本高(如:装载大文件、初始化耗时长、CPU资源占用多等)的对象作为原型,通过对其进行复制或者克隆,来创建其他类似的新实例。
•抽象工厂(Abstract Factory)模式:由继承自抽象工厂类的具体工厂分别来创建有相同联系的多个不同产品。
例如不同的培训学校,可以创建课程和课程所用的教材。
•建造者(Builder)模式:针对一个复杂对象,它的构建需要很多步骤和部件,将这种对象拆解成多个相对简单的构成部件或者步骤,然后再根据需要分别构建他们,直到得到该复杂对象。
例如:快餐店的套餐,他的构造分别由汉堡、饮料、薯条构成,这就要求建造或制作者分别创建各种物品,然后返回一个完整的套餐给点餐人员。
•工厂方法(Factory Method)模式:由继承自抽象工厂类的具体工厂来决定生成什么具体产品。
例如都属于家具厂的沙发工厂、桌椅工厂和床厂分别生产沙发、桌椅和床这些家具。
结构型模式这种模式关注如何将对象和类按照某种方式一起来构成新的、更大、更有效果的低耦合结构,这种组成方式用于类结构的继承、和用于对象结构的组合或聚合。
具有组合或聚合关系的各对象之间要比继承关系的各对象之间的耦合度弱,这样对象结构要比类对象具有更低的耦合度。
跟我学GOF程序代码编程中的各种设计模式——构建者设计模式
杨教授大学堂,版权所有,盗版必究。
3/3 页
1/3 页
杨教授大学堂,版权所有,盗版必究。
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
//返回最后组装成品结果(返回最后装配好的汽车), 但成品的组装过程不在这里 进行,而是转移到下面的 Director 类中进行。从而实现了解耦过程和部件 Product getResult(); } (2)其次,用 Director 构建最后的复杂对象,而在上面 Builder 接口中封装的是如何创建一 个个部件(复杂对象是由这些部件组成的),也就是说 Director 的内容是如何将部件最后组装 成成品。 public class Director{ private Builder builder; public Director( Builder builder ){ this.builder = builder; } // 将部件 partA、partB 和 partC 最后组成复杂对象。这里是将车轮方向盘和发动机 组装成汽车的过程 public void construct(){ builder.buildPartA(); builder.buildPartB(); builder.buildPartC(); } } (3)设计 Builder 的具体实现 ConcreteBuilder: 通过具体完成接口 Builder 来构建或装配产品的部件;定义并明确它所要创建的是什么 具体东西;提供一个可以重新获取产品的接口。 public class ConcreteBuilder implements Builder{ Part partA, partB, partC; public void buildPartA() { //这里是具体如何构建 partA 的代码 } public void buildPartB() { //这里是具体如何构建 partB 的代码
盘点GoF的23种设计模式
盘点GoF的23种设计模式前⾔设计模式最初并⾮出于软件设计中,⽽是⽤于建筑领域的设计中。
1995年,四位作者将建筑设计的基本模式融合到软件开发中,合作出版了《设计模式:可复⽤的⾯向对象软件的基础》,⼀共收录了23个设计模式,这是设计模式领域⾥程碑的事件,导致了软件设计模式的突破。
所以这四位作者在软件开发领域耦以四⼈帮(Gang Of Four)匿名著称,简称GoF。
⼀、设计模式的分类设计模式按照⽬的来划分的话可以划分为三种类型,分别为创建型模式、结构型模式和⾏为型模式1.1、创建型模式⽤于描述“怎样创建对象”,主要特点是将对象的创建和使⽤进⾏分离。
对象使⽤者不需要关⼼对象的创建细节,可以降低创建对象和使⽤对象之间的耦合度。
主要有单例模式、原型模式、⼯⼚⽅法模式、抽象⼯⼚模式和建造者模式等五种设计模式1.2、结构型模式⽤于描述如何将类或对象按某种布局组成更⼤的结构主要有代理模式、适配器模式、桥接模式、装饰器模式、外观模式、享元模式和组合模式等七种设计模式1.3、⾏为型模式⽤于描述类或对象之间怎样协作共同完成单个对象都⽆法单独完成的任务以及如何分配各个对象的职责分配主要有模版⽅法模式、策略模式、命令模式、责任链模式、状态模式、观察者模式、中介者模式、迭代器模式、访问者模式、备忘录模式和解释器模式等⼗⼀中设计模式⼆、创建型设计模式2.1、单例模式(Singleton)定义:某个类只能⽣成⼀个实例,该类需要提供⼀个全局访问点供外部获取该类的全局唯⼀实例单例模式的类需要满⾜以下三个要求:1.单例类只有⼀个实例对象2.单例对象必须由单例类⾃⾏创建3.单例类需要对外提供⼀个获取单例对象的全局访问点优缺点:1、保证内存中仅有⼀个实例,减少内存开销2、不易扩展,需求发⽣改变需要修改单例类,会违背开闭原则应⽤场景:1、需要频繁创建和销毁某个类的实例时;2、某个类的实例具有唯⼀性时3、类的创建实例的过程⾮常消耗资源时4、对象需要被全局共享时可参考⽂章:2.2、原型模式(Prototype)定义:将⼀个对象作为原型,通过对其复制从⽽克隆出多个和原型类似的新的实例优缺点:1、采⽤clone的⽅式⽐new⼀个对象性能更好,因为是直接基于内存⼆进制流的复制2、深克隆时需要每⼀层的对象都需要实现cloneable接⼝原型模式在Java中的实现依赖于cloneable接⼝,原型实现cloneable接⼝,需要根据原型创建新对象时,直接调⽤原型对象的clone⽅法进⾏复制即可应⽤场景:1、对象之间相同或相似时,⽆需通过new创建2、创建对象成本⼤,⽐如⽐较消耗CPU或⽹络资源等3、系统中⼤量使⽤该类对象,且各个调⽤者都需要给它的属性重写赋值时,⽐如状态等属性案例如下:业务场景⽃地主游戏有3⼈⽃地主和4⼈⽃地主,每种模式还分为新⼿房和⾼⼿房,此时可以抽象出游戏房间的类,并初始化各种类型的房间原型,每当有玩家进⼊对应模式的房间时就通过原型直接复制出⼀个房间即可。
设计模式精解-GOF23种设计模式解析(VS2012重写实现包含Linux Makefile) 代码和原文档已插入本文档
设计模式笔记(C++)一、创建型Factory:工厂1、定义创建对象的接口,封装了对象的创建2、使得具体化类的工作延迟到了子类中3、Factory模式正如我在相应的文档中分析的是为一类对象提供创建接口或者延迟对象的创建到子类中实现。
AbstractFactory:抽象工厂1、创建一组相关或者相互依赖的对象2、AbstractFactory模式是为创建一组(有多类)相关或者依赖的对象提供创建接口3、AbstractFactory模式通常都是使用Factory模式实现(ConcreateFactroy)Singleton:单例1、Singleton模式保证一个类仅有一个对象,并提供一个访问它的全局访问点。
2、全局变量不能防止实例化多个对象。
3、全局变量将使得对象在无论是否用到都要被创建。
Builder:创建者1、Builder模式的意图是非常容易理解、间接的:将一个复杂对象的构建与它的表示分离,使用同样的构建过程可以创建不同的表示(在示例代码中可以通过传入不同的参数实现这一点)。
Builder模式和AbstractFactory模式在功能上很相似,因为都是创建大的复杂的对象,它们的区别是:Builder模式强调的是一步步创建对象,并通过相同的创建过程可以获得不同的结果对象,一般来说Builder模式中对象不是直接返回的。
而在AbstractFactory 模式中对象是直接返回的,AbstractFactory模式强调的是为创建多个相互依赖的对象提供一个同一的接口。
Prototype:原型1、Prototype模式通过复制原型(Prototype)而获得新对象创建的功能,这里Prototype本身就是“对象工厂”(因为能够生产对象),实际上Prototype 模式和Builder模式、AbstractFactory模式都是通过一个类(对象实例)来专门负责对象的创建工作(工厂对象),它们之间的区别是:Builder模式重在复杂对象的一步步创建(并不直接返回对象),AbstractFactory模式重在产生多个相互依赖的对象,而Prototype模式重在从自身复制自己创建新类。
OOAD_Lec09_GOF设计模式一9
Object Oriented Analysis & Design面向对象分析与设计Lecture_09 GOF 设计模式(一)⏹4、GOF设计模式三: 外观模式Facade⏹“现有系统”功能强大、复杂,开发“新系统”需要用到其中一部分,但又要增加一部分新功能,该怎么办?Intent You want to simplify how to use an existing system.You need to define your own interface.现有系统的接口比较复杂,你希望利用原有的功能重新定义新的接口Problem You need to use only a subset of a complex system.Or you need to interact with the system in a particular way.如果只希望使用现有系统的部分功能、或者以一种特殊的方式与现有系统交互Solution The Facade presents a new interface for the client of the existing system to use.外观模式提供一套新的接口供客户使用现有系统Participants and collaborators It presents a simplified interface to the client that makes it easier to use.它呈现给客户一套简单地接口,易于使用。
Consequences The Facade simplifies the use of the required subsystem.However,because the Facade is not complete,certain functionality may be unavailable to the client.现有系统的部分功能,客户可能会不可用Implementation Define a new class(or classes)that has the required interface.Have this new class use the existing system.新定义的类,使用了现有系统的功能,为客户提供所需要的接口⏹动机Motivation⏹最小化通信Minimize communication⏹最小化依赖Minimize dependenciesClient ClassSubSystem Class4.2 外观模式的比喻Non-software examples⏹例如,贸易公司的客户通过目录下订单,就类似一个“外观模式⏹客户联系公司的客户联系代表⏹客户联系代表就作为“外观”,为客户提供接口,完成下单、付费、运输等公司内部复杂的功能⏹客户很轻松完成任务4.3 外观模式与适配器模式的比较⏹外观定义了新的接口,适配器使用旧的接口Facade defines a new interface,whereas Adapter uses an old interface⏹适配器使得两个不一致的接口协同工作,而不是定义一个新的Adapter makestwo existing interfaces work together as opposed to defining an entirely new one⏹外观模式的本意是产生一个轻便的接口,适配器的本意是把现有的接口转换一下The intent of Facade is to produce a simpler interface,and the intent of Adapter is to design to an existing interface⏹一个外观接口可能包装了多个现有系统的对象、也可能增加了一些新功能,而适配器只是包装一个对象While Facade routinely wraps multiple objects and Adapter wraps a single object⏹多数情况下,外观是单实例的Facade objects are often Singletons becauseonly one Facade object is required⏹GRASP原则的外观控制器,就是外观模式4.4 适用性Applicability⏹简化复杂系统的使用Provide a simple interface to a complex subsystem⏹You do not need to use all the functionality of a complex system and cancreate a new class that contains all the rules for accessing that system⏹If this is a subset of the original system,as it usually is,the API that youcreate for the new class should be much simpler than the original system's API⏹在使用复杂系统的某个功能时,可以加入新功能You want to use thefunctionality of the original system and want to add some new functionality as well⏹为客户软件层提供一个接口,隐藏了现有系统的细节Provide an interface to asoftware layer⏹You want to encapsulate or hide the original system⏹使客户与现有系统之间减少耦合、增加独立性、可移植性⏹节约成本⏹开发新的外观类的成本,要比每个人都去熟悉现有系统、了解如何使用现有系统的功能要节省许多本讲结束。
OOAD_Lec09_GOF设计模式一9
Object Oriented Analysis & Design面向对象分析与设计Lecture_09 GOF 设计模式(一)⏹3、GOF设计模式二: 适配器模式Adapter⏹为中国市场生产的电器,到了美国,需要有一个转接器才能使用墙上的插座,这个转接器的功能、原理?课程之前:复习单实例模式⏹SingleTon的三个关键点⏹1)私有的:构造函数⏹2)私有的:成员变量,记录这个单实例⏹3)公有的getter函数:没有实例时创建它;已有实例则返回该实例3.1 现实遇到的问题: 适配器Adapters⏹现实生活中充满着需要适配的场合⏹你知道吗?⏹面向对象中的适配器Object oriented adapters⏹Scenario:you have an existing software system that you need to work a new vendor library into,but the new vendor designed their interfaces differently than the last vendor ⏹What to do?Write a class that adapts the new vendor interface into the one you’re expecting.Your Existing SystemVendor ClassTheir interface doesn’t match the one you’ve written your code against. Not going to work!Your Existing System Vendor Class The adapter implementsthe interface yourclasses expectAnd talks to the vendor interface to service your requests == Your Existing SystemVendor Class No code changesNew codeNo code changes Adapter Adapter3.2 例现有一只火鸡,但需要的是一只鸭子….. If it walks like a duck and quacks like a duck, then it might be a duck-turkey wrapped with a duck adapter….public interface Duck {public void quack ();public void fly ();}public class MallardDuckimplements Duck {public void quack () {System.out.println(“Quack”);}public void fly ( ) {System.out.println (“I am flying”);}}//遇到一只家禽,火鸡Meet the fowl!public interface Turkey {public void gobble ();public void fly ( );}public class WildTurkey implements Turkey { public void gobble ( ) {System.out.println(“Gobble Gobble”);}public void fly ( ){System.out.println(“I’m flying a short distance”);}}Concrete implementations are similar --just print out the actions3.2 例Now….⏹需要用火鸡来代替鸭子的时候,因为两者的接口不同,不能直接使用⏹咋办?public class TurkeyAdapter implements Duck { Turkey turkey;public TurkeyAdapter (Turkey turkey) {this.turkey = turkey;}public void quack ( ) {turkey.gobble ( );}public void fly ( ){for (int j = 0; j<5; j++)turkey.fly ( );}}}First,you need to implement the interfaceof the type you are adapting to.This is theinterface your client expects.希望有只鸭子Next,we need to get a reference to the object that we are adapting;here we do that through the constructor.传进来一只火鸡Now we need to implement all the methods in theinterface;the quack()translation between classes iseasy;just call the gobble method.将就着吧,需要鸭子叫的时候,就让让火鸡叫吧Even though both interfaces have a fly()method,Turkeys fly in short spurts--they can’t do long distance flying like ducks.To map between a Duck’s fly()method and a Turkey’s we need to call the Turkey’s fly() method five times to make up for it.需要鸭子飞的时候,让火鸡多飞几次,假装是鸭子飞。
通过代码示例学习GOF设计模式(第9章GOF模板方法模式)
通过代码示例学习GOF设计模式(第9章GOF模板方法模式)前言软件开发工作从本质上属于创造性的工作,它是一种将“软件产品”从无到有生的创建过程。
行业内流行的“站在巨人的肩膀上”、“不要重复地发明轮子”、“不要不断地重复自己”等“名言警句”其实都是对“软件复用”思想的具体体现。
面向对象程序设计方法提供了类级别的重用;而基于“组件化”的复用方式,已使软件系统产品在质量保证、开发效率等方面得到了更大的提高;面向框架级的系统集成开发(如J2EE中的SSH、、PHP的LAMP等),不仅可以实现组件级别的重用,而且在系统的总体架构、软件设计思想等方面都可以得到重用。
因此“面向对象”、“组件化”、“基于XML的数据结构描述”、“面向框架”等设计思想和实现技术,更使得软件系统的“复用”达到了一个更深的层次,随之而来的各种企业级“中间件组件”、AOP、SOA等技术的出现,也使得开发者的主要精力可以越来越多地关注于应用系统的业务逻辑和业务数据,而非系统“底层”的具体实现技术和各个不同技术平台之间、各个数据库系统之间的差异。
作者接触很多高校计算机软件专业类的教师和学生,深感目前的计算机软件开发类专业的程序设计类各个课程在教学方面的欠缺,不仅编码不规范(胡写代码和混乱命名)、技术深度不足(学C语言不学习指针、学Java不学习集合、反射和范型),而且程序代码还存在许多不可靠、性能低下、扩展性差等方面的问题;国内许多“小作坊”型的软件公司人员不断地生产出大量的“垃圾代码”,从而使得这些软件公司的项目都是“一次性买卖”,客户方受骗后再也没有第二次的项目开发。
作者根据自身多年的软件开发实践和经验总结,结合多年的IT职业培训的教学和高校软件学院一线的教学工作体验,在本系列文档中通过具体的程序代码示例为读者介绍GOF 设计模式及相关的应用技术。
主要的目的是希望能够以成功的经验或者失败的教训为读者减少软件开发失败的风险,同时也为高校师生总结出如何能够编程开发出一个“易读的”、“易维护的”、“易扩展”、“高性能”和“可重用”的系统程序。
OOAD_Lec09_GOF设计模式一9
Object Oriented Analysis & Design面向对象分析与设计Lecture_09 GOF 设计模式(一)⏹1、关于设计模式…Design Pattern⏹追求永恒的美1.1 “模式”一词的起源“每个模式描述了:一个在我们周围反复出现的问题,然后是针对这个问题的解决方案。
这样,其他人可以无数次地反复使用这种解决方案,不需要第二次再去思考该如何解决这类问题”---Christopher Alexander,1979Christopher Alexander最初是在建筑行业、小镇建设中提出来的在软件工程中,设计模式是建立在类、对象、接口这些概念的上面,而不是砖块、门In SE,design patterns are in terms of objects and interfaces,not walls and doors1.2 GoF(Gang of Four)设计模式Design Patterns–Elements of ReusableObject-Oriented Software by Erich Gamma, Richard Helm,Ralph Johnson&John VlissidesAddison-Wesley, 1995. (As CD, 1998)简称GOF,“四人帮”First systematic software pattern description第一本系统性引入软件设计模式注意: 设计模式不是他们“创建”出来的,而是他们在大量软件中“提炼”出来的⏹设计模式的特点⏹描述了一个反复出现的问题describes a problem which occurs over⏹描述了核心的解决方案describes the core of the solution⏹其他人可以无数次地使用这个方案解决类似的问题⏹模式的定义,四个本质的构成four essential elements⏹模式的名字Name of the Pattern⏹模式解决的问题The Problem⏹模式提出的解决方案The Solution⏹应用模式的后果、折衷考虑的问题Consequences,tradeoffs⏹注意点⏹解决方案针对反复出现的问题a solution to a recurrent problem⏹不是一个“具体”的解决方案,而是一个抽象的方案not a“concrete”solution,but an abstract version of it1.4 模式的作用Patterns help to⏹解决某些特殊的设计问题solve specific design problems⏹减少重复设计的工作量reduce the need for redesign⏹重用设计方案比重用代码更有意义,它会自动带来代码重用⏹模式在实践中可作为模板使用act as templates⏹把专家的知识、经验传递给新手pass on knowledge from experts to novices⏹为设计提供共同的词汇Common Vocabulary⏹每个模式名就是一个设计词汇,其概念使得程序员间的交流更加方便⏹编写开发文档更加容易Easy Documentation⏹在开发文档中采用模式名称可以让其他人更容易理解设计师的想法,为什么这么做?做了些什么?⏹应用设计模式可以让系统重构变得容易Easy refactor1.5 关于模式的误解⏹模式不是Patterns are not...⏹类Classes⏹函数库Libraries⏹功能包Packages⏹宏定义Macros⏹高阶函数Higher-order functions⏹一个高阶函数可以将函数作为参数,也可以返回一个函数⏹模板类Template classes⏹但是,模式确实是由这些元素构成的However,some of these could conceivably(令人信服地)capture some design patterns1.6 模式的学习进阶⏹模式的学习是一个渐进的过程⏹误解了模式是什么⏹误解了模式能做什么⏹注意:⏹下决心学习模式、弄明白模式的本质,并不断地应用熟悉,以后的收益很大⏹模式不会为你提供什么保证,它只能提高你的潜能,让你的软件设计更加成熟误解地区知识时间无知惊愕开始学习明白熟悉获益本讲结束。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ConcreteFlyweight - intrinsicState : + operation ( extrinsicState) ...
UnsharedConcreteFlyweight - allState : + operation ( extrinsicState) ...
享元模式
模式结构
享元模式
模式分析
典型的享元工厂类代码: 典型的享元工厂类代码:
public class FlyweightFactory{ private HashMap flyweights = new HashMap(); public Flyweight getFlyweight(String key){ if(flyweights.containsKey(key)){ return (Flyweight)flyweights.get(key); } else{ Flyweight fw = new ConcreteFlyweight(); flyweights.put(key,fw); return fw; } } }
Hub - type : String + Hub (String type) : String + getType () + use (Port port) : void ...
享元模式
模式优缺点
享元模式的优点
• 享元模式的优点在于它可以极大减少内存中对象的数 量,使得相同对象或相似对象在内存中只保存一份。 • 享元模式的外部状态相对独立,而且不会影响其内部 状态,从而使得享元对象可以在不同的环境中被共享。
NetworkDevice
devices
+ getType () : String + use (Port port) : void ...
Switch - type : String + Switch (String type) : String + getType () + use (Port port) : void ...
享元模式
享元模式实例与解析
实例一:共享网络设备(无外部状态) 实例一:共享网络设备(无外部状态)
• 很多网络设备都是支持共享的,如交换机、集线器等,多台终端 计算机可以连接同一台网络设备,并通过该网络设备进行数据转 发,如图所示,现用享元模式模拟共享网络设备的设计原理。
享元模式
享元模式实例与解析
NetworkDevice
devices
+ getType () : String + use () : void ...
Switch - type : String + Switch (String type) + getType () : String + use () : void ...
Hub - type : String + Hub (String type) + getType () : String + use () : void ...
享元模式
模式定义
Flyweight Pattern: Use sharing to support large numbers of fine-grained objects efficiently. Frequency of use: low
享元模式
模式结构
FlyweightFactory - flyweights : HashMap + getFlyweight (String key) : Flyweight ... Flyweight
享元模式
模式分析
享元模式的核心在于享元工厂类, 享元模式的核心在于享元工厂类,享元工厂类的作用 享元工厂类 在于提供一个用于存储享元对象的享元池, 在于提供一个用于存储享元对象的享元池,用户需要 对象时,首先从享元池中获取,如果享元池中不存在, 对象时,首先从享元池中获取,如果享元池中不存在, 则创建一个新的享元对象返回给用户, 则创建一个新的享元对象返回给用户,并在享元池中 保存该新增对象。 保存该新增对象。
享元模式包含如下角色: 享元模式包含如下角色: • Flyweight: 抽象享元类 • ConcreteFlyweight: 具体享元类 • UnsharedConcreteFlyweight: 非共享具体享元类 • FlyweightFactory: 享元工厂类
享元模式
模式分析
享元模式是一个考虑系统性能的设计模式 享元模式是一个考虑系统性能的设计模式,通过使用 考虑系统性能的设计模式, 享元模式可以节约内存空间 提高系统的性能。 节约内存空间, 享元模式可以节约内存空间,提高系统的性能。
享元模式
模式应用
(1)享元模式在编辑器软件中大量使用,如在一个文 享元模式在编辑器软件中大量使用, 享元模式在编辑器软件中大量使用 档中多次出现相同的图片, 档中多次出现相同的图片,则只需要创建一个图片对 通过在应用程序中设置该图片出现的位置, 象,通过在应用程序中设置该图片出现的位置,可以 实现该图片在不同地方多次重复显示。 实现该图片在不同地方多次重复显示。
享元模式
享元模式实例与解析
实例二:共享网络设备(有外部状态) 实例二:共享网络设备(有外部状态)
Port - port : String + Port (String port) + setPort (String port) : void + getPort () : String ... DeviceFactory - devices : ArrayList = new ArrayList() - totalTerminal : int =0 + DeviceFactory () + getNetworkDevice (String type) : NetworkDevice + getTotalDevice () : int + getTotalTerminal () : int ...
享元模式
享元模式实例与解析
实例二:共享网络设备(有外部状态) 实例二:共享网络设备(有外部状态) • 虽然网络设备可以共享,但是分配给每一个终端计算 机的端口(Port)是不同的,因此多台计算机虽然可以 共享同一个网络设备,但必须使用不同的端口。我们 可以将端口从网络设备中抽取出来作为外部状态,需 要时再进行设置。
享元模式
模式分析
享元模式以共享的方式高效地支持大量的细粒度对象,享元对象 享元模式以共享的方式高效地支持大量的细粒度对象, 能做到共享的关键是区分内部状态 内部状态(Internal State)和外部状态 能做到共享的关键是区分内部状态 和 (External State)。 。 (1) 内部状态是存储在享元对象内部并且不会随环境改变而改 变的状态,因此内部状态可以共享。 (2) 外部状态是随环境改变而改变的、不可以共享的状态。享 元对象的外部状态必须由客户端保存,并在享元对象被创建之 后,在需要使用的时候再传入到享元对象内部。一个外部状态 与另一个外部状态之间是相互独立的。
实例一:共享网络设备(无外部状态) 实例一:共享网络设备(无外部状态)
DeviceFactory - devices : ArrayList = new ArrayList() - totalTerminal : int =0 + DeviceFactory () + getNetworkDevice (String type) : NetworkDevice : int + getTotalDevice () + getTotalTerminal () : int ...
flyweights
+ operation ( extrinsicState) ...
if(flyweights.containsKey(key)) { return (Flyweight )flyweights.get(key); } else { Flyweight fw=new ConcreteFlyweight(); flyweights.put(key,fw); return fw; }
第9讲 享元模式 代理模式
本讲教学内容
享元模式
模式动机与定义 模式结构与分析 模式实例与解析 模式效果与应用 模式扩展
享元模式
模式动机
面向对象技术可以很好地解决一些灵活性或可扩展性问 但在很多情况下需要在系统中增加类和对象的个数。 题,但在很多情况下需要在系统中增加类和对象的个数。 当对象数量太多时,将导致运行代价过高, 当对象数量太多时,将导致运行代价过高,带来性能下 降等问题。 降等问题。 享元模式正是为解决这一类问题而诞生的。 享元模式正是为解决这一类问题而诞生的。享元模式通 正是为解决这一类问题而诞生的 过共享技术实现相同或相似对象的重用。 过共享技术实现相同或相似对象的重用。
享元模式
模式定义
享元模式(Flyweight Pattern):运用共享技术有效地 共享技术有效地 享元模式 :运用共享技术 支持大量细粒度对象的复用。系统只使用少量的对象, 细粒度对象的复用 支持大量细粒度对象的复用。系统只使用少量的对象, 而这些对象都很相似,状态变化很小,可以实现对象的 而这些对象都很相似,状态变化很小, 多次复用。 多次复用。由于享元模式要求能够共享的对象必须是细 粒度对象,因此它又称为轻量级模式 它是一种对象结 轻量级模式, 粒度对象,因此它又称为轻量级模式,它是一种对象结 构型模式。 构型模式。
享元模式
模式动机
享元模式
模式动机
在享元模式中可以共享的相同内容称为内部状态 在享元模式中可以共享的相同内容称为内部状态(Intrinsic 可以共享的相同内容称为内部状态 State),而那些需要外部环境来设置的不能共享的内容称为 ,而那些需要外部环境来设置的不能共享的内容称为 外部状态(Extrinsic State),由于区分了内部状态和外部状 外部状态 , 态,因此可以通过设置不同的外部状态使得相同的对象可以 具有一些不同的特征,而相同的内部状态是可以共享的。 具有一些不同的特征,而相同的内部状态是可以共享的。 在享元模式中通常会出现工厂模式,需要创建一个享元工厂 在享元模式中通常会出现工厂模式,需要创建一个享元工厂 来负责维护一个享元池(Flyweight Pool)用于存储具有相同 来负责维护一个享元池 用于存储具有相同 内部状态的享元对象。 内部状态的享元对象。