您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 其它文档 > 第十二_设计模式概述-创建性设计模式.
下午3时30分第十二次设计模式概述Designpattern任课老师:黄武下午3时30分提纲设计模式概述创建型设计模式1.工厂设计模式(Factory)2.单例设计模式(Singleton)下午3时30分1.设计模式概述设计模式的历史设计模式的概念设计模式的组成要素设计模式的分类开闭原则下午3时30分1.1设计模式历史设计模式来源于建筑学领域1977年,ChristopherAlexander等著《APatternLanguage:Towns,Buldings,Construction》罗马式建筑-圆顶哥特式建筑-尖顶下午3时30分1.1.1设计模式历史1987年,KentBeck在OOPSLA国际会议上,首次将模式的思想引入到面向对象的设计领域中1994年,ErichGamma,RichardHelm等人所著的《DesignPatterns:ElementsofReusableObject-OrientedSoftware》成为软件设计模式的标志性著作。该书总结了3类23种经典设计模式ErichGamma等人认为设计模式描述了定制化的相互通信的对象与类,以解决特定环境中的通用设计问题下午3时30分1.1.2设计模式的著作1.Frank.Buschmann著《Pattern-OrientedSoftwareArchtecture》总结了13类114类设计模式2.MartinFowler著《PatternsofEnterpriseApplicationArchitecture》总结了10类41类设计模式3.ThomasErl著《SOADesignPatterns》总结了面向服务构架中的5类85种设计模式下午3时30分1.2设计模式概念设计模式(DesignPattern)是对软件设计经验的总结,是软件设计中反复出现的设计问题的成功解决方案,其核心思想是软件复用设计模式主要用于软件的局部设计下午3时30分1.3设计模式的组成要素设计模式通常包含4个基本要素1.名称2.问题描述3.解决方案4.效果下午3时30分1.4设计模式的分类按照面向对象分为3类按照分布式计算分为13类,包括:分布式基础设施,组件划分,并发及同步等。按照企业应用软件分为10类,包括领域逻辑模型,数据源构架模式,Web表现模式等按照面向服务的体系结构(SOA)分为3类:服务设计模式,服务库设计模式以及服务组合设计模式下午3时30分1.4.1面向对象设计模式分类面向对象的设计模式可以分为三类:1.创建型设计模式:如工厂模式2.结构型设计模式:如组合模式3.行为型设计模式:如迭代器模式下午3时30分1.5开闭原则开闭原则是指禁止修改模块中已经存在的代码,但模块的行为则是可以扩展的下午3时30分2.工厂模式创建型模式问题的提出工厂方法简单工厂模式工厂模式抽象工厂模式下午3时30分2.1创建型模式创建型设计模式是解决对象创建机制的设计模式创建型设计模式的目标是将一个系统与其对象的创建、组合与表示分离,其目的是增加对象创建的灵活性创建型模式的主导思想是:封装了使用的具体类的知识及隐藏这些具体类的实例被创建与结合的细节下午3时30分2.2工厂设计模式问题的提出人类最开始进行家庭作坊式的生产,后来将生产集中起来,形成工厂手工制鞋工厂制鞋各种鞋子使用和生产的分离下午3时30分2.2.1软件中的“本地制作”不同硬件之间的数据传输可以采用各种不同的通讯方式,比如USB,COM,WiFi,Bluetooth等,假设设计一个软件,要根据条件与各种不同的硬件进行通讯在Main()方法中就要根据条件选择生成不同的通讯类下午3时30分2.2.2本地生成的类图ClientGUI-com:Communication+Main()《Interface》Communication+Connect()USB+Connect()COM+Connect()Bluetooth+Connect()WiFi+Connect()下午3时30分2.2.3Main函数中的代码voidMain(intargc){Communicationcom;if(argc==USB){com=newUSB();}elseif(argc==BLUETOOTH){com=newBluetooth();}…}下午3时30分2.3工厂方法为了简化Main()函数,把Main()函数中关于对象创建的代码抽取出来构成一个函数,这个函数专门用于构造对象,被称为工厂方法,其命名为CreateObj()将Main函数中创建对象的判断语句移入到CreateObj()方法中,而仅在Main函数中调用CreateObj()方法,从而简化程序下午3时30分2.3.1工厂方法的类图在ClientGUI类中增加了CreateObj()方法ClientGUI-com:Communication+Createobj(inttype);+Main()《Interface》Communication+Connect()USB+Connect()COM+Connect()Bluetooth+Connect()WiFi+Connect()下午3时30分2.3.2工厂方法的优点使用工厂方法创建合适的对象,简化了应用程序工厂方法实现了一些特殊的初始化某个类的机制,隐藏了创建对象的细节工厂方法返回一个父类的对象,客户程序不必知道具体的被创建类工作方法实现了创建与应用分离的思想下午3时30分2.4简单工厂模式工厂方法并没有将对象的创建工作彻底从原来的客户类中提取出来,客户类还是必须知道创建对象的细节,不利于创建工作的扩展为了把创建工作独立出来,构建另外一个单独的类专门负责创建其它对象的工作,这种创建对象的模式被称为简单工厂设计模式下午3时30分2.4.1简单工厂模式的类图1.Creator:简单工厂模式的创建类,使用factory方法创建具体的对象2.Product:具有共同接口的父类3.ConcreteProduct:继承于Product类的子类ClientGUI+Main()《Interface》Product+Operation()Creator+factory():ProductConcreteProduct+Operation()create下午3时30分2.4.2简单工厂模式的特点简单工厂模式仅有一个具体的创建者类CreatorCreator类中包含一个静态的工厂方法factory()下午3时30分2.4.3简单工厂模式的优点客户类不直接创建产品类的对象,客户类只作为对象的消费者,因此得到简化客户类不负有创建对象的责任,因此在不修改客户类的情况下就可以增加新产品子类简单工厂方法模式实现了责任分离工厂方法包含从一个类的结构中选择初始类的业务逻辑下午3时30分2.4.4简单工厂模式的缺点工厂方法知道如何构建子类对象,因此每次增加新产品类型时,都需要修改工厂方法代码,不符合开闭原则工厂方法是静态的,因此工厂类的方法不能被继承,它只是一个单独的类,不能构成一个层次类下午3时30分2.5工厂模式工厂模式是为克服简单工作模式的缺点而提出的改进方法,其做了如下改进:1.将单一工厂构造类变成一个层次化的工厂构造类2.用不同的工厂创建不同的产品下午3时30分2.5.1工厂模式的类图Client+Main()CreatorA+factory():Product《Interface》Creator+factory():Product《Interface》Product+Operation():voidCreatorB+factory():ProductProductA+Operation()ProductB+Operation()《create》《create》下午3时30分2.5.2简单工厂模式与工厂模式的区别简单工厂模式只有一个工厂类Creator,其工厂方法是一个静态方法Factory(),而工厂模式构成层次化的工厂类,其工厂方法是动态的简单工厂模式不支持开闭原则,而工厂模式支持开闭原则简单工厂模式对象的创建逻辑判断包含在工厂方法中,而工厂模式中的工厂方法不包含创建对象的逻辑判断下午3时30分2.5.3工厂模式的适用情况创建某些类的对象的逻辑比较复杂一个类不能预先准确地知道它必须创建一个层次类中的哪个子类一个类使用它的子类决定所要创建的对象需要封装创建类的对象的逻辑,使得这些创建逻辑局部化下午3时30分2.5.4工厂模式的优点工厂方法模式将创建对象的逻辑与任务交给了工厂类工厂方法模式支持开闭原则自己阅读书上的例2.3下午3时30分2.6抽象工厂模式在工厂方法模式中针对一组产品构造了另外一组工厂类,并且工厂类与产品类有相同的结构如果有两组以上相同结构的产品类,是否还是可以使用工厂模式来创建呢?抽象工作模式就是要解决不同产品类的统一创建方法下午3时30分2.6.1抽象工厂模式类图《Interface》Creator+factoryA():ProductA+factoryB():ProductB《Interface》ProductA+OperationA()《create》ConcreterCeatorA+factoryA():ProductA+factoryB():ProductBConcreterCeatorB+factoryA():ProductA+factoryB():ProductB《Interface》ProductA1+OperationA()《Interface》ProductA2+OperationA()《Interface》ProductB+OperationB()《Interface》ProductB1+OperationB()《Interface》ProductB2+OperationB()《create》《create》下午3时30分2.6.2抽象工厂模式适用情况当客户对象要从一个相关的产品组中创建一个对象,而没有必要知道到底创建哪个对象时,可以应用抽象工厂模式下午3时30分2.6.3抽象工厂模式举例设计一个房屋销售查询系统,以便查询不同类型房屋的介绍、价格和地址。现在考虑有两种类型的房屋:别墅(House)和公寓(Condo)。假设这两种房屋类型都包含:豪华(Super)和中等(Medium)两个等级使用抽象工厂模式实现这个查询系统下午3时30分2.6.4查询系统的类图BuildingFactory+getBuildingFactory(type)+getHouse():House+getCondo():Condo《Interface》House+getHouseInfo()《create》MediumBuildingFactory+getHouse():House+getCondo():CondoSuperHouse+getHouseInfo()《create》《create》ClientGUI+Main()SuperBuildingFactory+getHouse():House+getCondo():CondoMediumHouse+getHouseInfo()《Interface》Condo+getCondoInfo()SuperCondo+getCondoInfo()MediumCondo+getCondoInfo()下午3时30分2.6.5查询系统的工作原理(1)1.客户ClientGUI调用抽象类BuildingFactory类的静态getBuildingFactory(type:String)方法2.getBuildingFactory(type:String)方法根据参数类型创建一个适当的工厂子类MediumBuilding或者SuperBuildingFactory对象,并且以它的超类BuildingFactory的类型返回给客户类下午3时30分2.6.6查询系统的工作原理(2)3.客户类使用以
本文标题:第十二_设计模式概述-创建性设计模式.
链接地址:https://www.777doc.com/doc-3279967 .html