UML设计模式 9 设计模式(3)--Factory,Singleton模式.ppt
-
资源ID:69533253
资源大小:1.28MB
全文页数:24页
- 资源格式: PPT
下载积分:15金币
快捷下载
![游客一键下载](/images/hot.gif)
会员登录下载
微信登录下载
三方登录下载:
微信扫一扫登录
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
|
UML设计模式 9 设计模式(3)--Factory,Singleton模式.ppt
9 设计模式设计模式(3)Factory、Singleton模式模式权权 巍巍主要内容9.1 工厂模式(工厂模式(Factory)9.1.1简单工厂简单工厂9.1.2工厂方法工厂方法9.1.3抽象工厂抽象工厂9.2 单例模式(单例模式(Singleton)9.3 里氏代换原则里氏代换原则2UML和设计模式9.1 工厂模式工厂模式-创建型模式创建型模式创建型模式(创建型模式(Creational Creational PatternPattern)是对类的实例化过程的抽象化。一些系统在创是对类的实例化过程的抽象化。一些系统在创建对象时,需要动态地决定怎样创建对象,创建建对象时,需要动态地决定怎样创建对象,创建哪些对象,以及如何组合和表示这些对象。创建哪些对象,以及如何组合和表示这些对象。创建型模式描述了怎样构造和封装这些动态的决定。型模式描述了怎样构造和封装这些动态的决定。创建型模式分为类的创建型模式和对象的创建创建型模式分为类的创建型模式和对象的创建型模式。型模式。3UML和设计模式9.1.1 简单工厂模式简单工厂模式创建对象创建对象问题:不能应对问题:不能应对“具体实例化类型具体实例化类型”的变化。的变化。开闭原则(对扩展开放、对修改封闭)开闭原则(对扩展开放、对修改封闭)解决思路:封装变化点解决思路:封装变化点哪里变化,封装哪里哪里变化,封装哪里 常规方法创建对象:常规方法创建对象:Road road=new Road();Road sandroad=new sandRoad();4UML和设计模式9.1.1 简单工厂模式简单工厂模式一个农场的例子一个农场的例子5UML和设计模式简单工厂模式(静态工厂方法模式)简单工厂模式(静态工厂方法模式)就是一个工厂类根据传入的参数决定创建出哪一种产就是一个工厂类根据传入的参数决定创建出哪一种产品类的实例。品类的实例。6UML和设计模式简单工厂模式的三个角色:简单工厂模式的三个角色:工厂类角色工厂类角色模式的核心,负责根据传入的参数决定创建出哪种模式的核心,负责根据传入的参数决定创建出哪种具体产品类的对象,通常为具体类。具体产品类的对象,通常为具体类。抽象产品抽象产品由模式所创建的对象的父类,或它们共同拥有的接由模式所创建的对象的父类,或它们共同拥有的接口担任,可为抽象类或接口。口担任,可为抽象类或接口。具体产品具体产品模式所创建的任何对象都是这个角色的实例,为具模式所创建的任何对象都是这个角色的实例,为具体类。体类。7UML和设计模式示例代码(简单工厂):示例代码(简单工厂):/抽象产品(接口或抽象类)抽象产品(接口或抽象类)interface Road /具体产品具体产品Class railRoad extends Road Class sandRoad extends Road /具体工厂具体工厂:是核心,负责创建具体产品是核心,负责创建具体产品class RoadFactory public static Road CreateRoad(String name)/根据不同的情况根据不同的情况(如名字等如名字等)创建不同的产品创建不同的产品 return new railRoad();/创建一个创建一个Road 对象对象Road road=RoadFactory.CreateRoad(“railroad”);客户程序:客户程序:8UML和设计模式p简单工厂模式的优点:简单工厂模式的优点:设计简单,产品类的等级结构不会反映到工厂类中,设计简单,产品类的等级结构不会反映到工厂类中,从而产品类等级结构的变化也就不会影响到工厂类。从而产品类等级结构的变化也就不会影响到工厂类。由工厂类决定何时创建何种产品类的对象,免除了由工厂类决定何时创建何种产品类的对象,免除了客户端创建产品类对象的责任。客户端创建产品类对象的责任。p缺点:缺点:静态:增加新的产品静态:增加新的产品(如如WaterRoad)WaterRoad)时,要修改工厂时,要修改工厂类,违反了面向对象设计的基本原则。类,违反了面向对象设计的基本原则。工厂类负责创建所有产品,一旦不能正常工作,整工厂类负责创建所有产品,一旦不能正常工作,整个程序都会受到影响。个程序都会受到影响。9UML和设计模式9.1.2工厂方法模式(多态性工厂模式)工厂方法模式(多态性工厂模式)问题:需要频繁增加新的对象问题:需要频繁增加新的对象解决:封装变化点解决:封装变化点 (抽象的工厂)(抽象的工厂)10UML和设计模式 在工厂方法模式中,核心的工厂类不再负责所有在工厂方法模式中,核心的工厂类不再负责所有的产品的创建,而是将具体创建的工作交给子类去的产品的创建,而是将具体创建的工作交给子类去做,即本模式中包含:抽象工厂、具体工厂。做,即本模式中包含:抽象工厂、具体工厂。抽象工厂抽象工厂:负责给出具体工厂类必须实现的接口。:负责给出具体工厂类必须实现的接口。具体工厂具体工厂:实现抽象工厂接口,用于创建具体的:实现抽象工厂接口,用于创建具体的 产品实例。产品实例。抽象产品抽象产品具体产品具体产品(2)工厂方法模式(多态性工厂模式)工厂方法模式(多态性工厂模式)11UML和设计模式农场例子-工厂方法模式UML和设计模式12/抽象产品(接口或抽象类)抽象产品(接口或抽象类)interface Road /具体产品具体产品class railRoad implements Road class sandRoad implements Road /抽象工厂(稳定不变)抽象工厂(稳定不变)interface RoadFactory public abstract Road CreateRoad();/railRoad、sandRoad等对象的具体工厂等对象的具体工厂class railRoadFactory implements RoadFactory public Road CreateRoad()return new railRoad();class sandRoadFactory implements RoadFactory public Road CreateRoad()return new sandRoad();工工厂厂方方法法模模式式代代码码实实例例class waterRoad implements Road class waterRoadFactory implements RoadFactory public Road CreateRoad()return new waterRoad();13UML和设计模式/客户端程序:依赖抽象工厂、抽象产品客户端程序:依赖抽象工厂、抽象产品class Client public static void main(String args)RoadFactory rf1,rf2;Road road1,road2,road3;/实例化实例化2个个railRoad对象对象 rf1=new railRoadFactory();road1=rf1.CreateRoad();/稳定不变稳定不变 road2=rf1.CreateRoad();/实例化实例化1个个sandRoad对象对象 rf2=new sandRoadFactory();road3=rf2.CreateRoad();14UML和设计模式9.1.3 抽象工厂模式抽象工厂模式问题问题:经常需要创建一个新的系列,即产品族。:经常需要创建一个新的系列,即产品族。产品族(产品族(Product Family):是指功能相关联的):是指功能相关联的产品组成的家族。产品组成的家族。每个产品族包含相互依赖的对象,这些对象稳定每个产品族包含相互依赖的对象,这些对象稳定不变不变。抽象工厂模式的意图抽象工厂模式的意图:向客户提供一个接口,使向客户提供一个接口,使得客户可以在不必指定产品的具体类型的情况下,得客户可以在不必指定产品的具体类型的情况下,创建多个产品族中的产品对象。创建多个产品族中的产品对象。15UML和设计模式抽象工厂模式类图结构抽象工厂模式类图结构ConcreteFactory3CreateProductA()CreateProductB()ProductA3ProductB316UML和设计模式抽象工厂抽象工厂:负责给出具体工厂类必须实现的接口,:负责给出具体工厂类必须实现的接口,是模式的核心,与应用系统的逻辑无关。是模式的核心,与应用系统的逻辑无关。具体工厂具体工厂:实现抽象工厂接口,直接在客户端的:实现抽象工厂接口,直接在客户端的调用下创建产品实例。这个角色含有选择合适的调用下创建产品实例。这个角色含有选择合适的产品对象的逻辑,与应用系统的逻辑紧密相关。产品对象的逻辑,与应用系统的逻辑紧密相关。抽象产品:抽象产品:具体产品:具体产品:抽象工厂模式的角色抽象工厂模式的角色17UML和设计模式(3)抽象抽象工厂模式工厂模式代码实例:代码实例:抽象工厂:抽象工厂:FacilityFactory具体工厂(对应产品族):具体工厂(对应产品族):IceFacilityFactory、DesertFacilityFactory。抽象产品:抽象产品:Road、Building、Tunnel具体产品:具体产品:IceRoad、DesertRoad、IceBuilding、DesertBuilding、IceSky、DesertSky18UML和设计模式农场例子抽象工厂模式UML和设计模式199.2 单例模式(Singleton)UML和设计模式20单例模式的特点单例模式的特点单例类只能有一个实例;单例类只能有一个实例;单例类必须自己创建自己的这个唯一的实例;单例类必须自己创建自己的这个唯一的实例;单例类必须给所有对象提供这一实例。单例类必须给所有对象提供这一实例。什么是Singleton单例模式单例模式的意图:保证一个类仅有一个实例,并提供单例模式的意图:保证一个类仅有一个实例,并提供一个该类实例的全局访问点。一个该类实例的全局访问点。UML和设计模式21单例模式的类图解析u私有的构造方法私有的构造方法u类型为单例类本身的静态变量类型为单例类本身的静态变量u获得单例类的唯一实例的方法获得单例类的唯一实例的方法UML和设计模式22UML和设计模式23单例模式示意代码单例模式示意代码:publicclassSingletonprivatestaticSingletoninstance=null;/其它成员数据protectedSingleton()publicstaticSingletongetInstance()if(instance=null)instance=newSingleton();returninstance;9.3 里氏代换原则里氏代换原则(里氏代换原则(Liskov Substitution Principal,LSP)的严格表达如下:)的严格表达如下:如果对每一个类型为如果对每一个类型为T1T1的对象的对象o1o1,都有类型为,都有类型为T2T2的对象的对象o2o2,使得以,使得以T1T1定义的所有程序定义的所有程序P P在所有的对象在所有的对象o1o1都代换成都代换成o2o2时,程序时,程序P P的行为没有变化,那么类型的行为没有变化,那么类型T2T2是是类型类型T1T1的子类型。的子类型。换言之,一个软件实体如果使用的是基类的话,那么换言之,一个软件实体如果使用的是基类的话,那么一定适用于其子类,而且它根本不能察觉出基类对象一定适用于其子类,而且它根本不能察觉出基类对象和子类对象的区别。和子类对象的区别。UML和设计模式24