软件体系结构实验设计模式

上传人:仙*** 文档编号:33829263 上传时间:2021-10-19 格式:DOC 页数:15 大小:1.05MB
收藏 版权申诉 举报 下载
软件体系结构实验设计模式_第1页
第1页 / 共15页
软件体系结构实验设计模式_第2页
第2页 / 共15页
软件体系结构实验设计模式_第3页
第3页 / 共15页
资源描述:

《软件体系结构实验设计模式》由会员分享,可在线阅读,更多相关《软件体系结构实验设计模式(15页珍藏版)》请在装配图网上搜索。

1、课 程 实 验 报 告专 业 年 级 12软件工程 课 程 名 称 软件体系结构 指 导 教 师 xxxxxxxx 学 生 姓 名 xxxxxxxxx 学 号 XXXXXXXXXX 实 验 日 期 2015.6.3 实 验 地 点 笃行楼A栋201 实 验 成 绩 教务处制20 年 月 日实验项目名称设计模式-1实验目的及要求掌握简单工厂模式.工厂方法模式. 抽象工厂模式实验内容运用简单工厂模式.工厂方法模式. 抽象工厂模式的基本原理,设计出相应的案例。实验步骤一、 简单工厂模式1、 定义简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属

2、于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。2、 基本原理简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。该模式中包含的角色及其职责工厂(Creator)角色简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。抽象产品(Product)角色简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。具体产品(Concret

3、e Product)角色是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。3、 优缺点优点:工厂类是整个模式的关键.包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体类的对象.通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可以了。而不必管这些对象究竟如何创建及如何组织的明确了各自的职责和权利,有利于整个软件体系结构的优化。缺点:由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。当系统中

4、的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利;4、 案例女娲造人,造人的过程是这样的:首先,女娲采集黄土捏成人的形状,然后放到八卦炉中烧制,最后放置到大地上生长,烧制过程中出现三种情况:(1)烧制时间过短,制造出白种人(2)烧制时间过长,制造出黑种人(3)烧制时间刚好,制造出黄种人简单工厂模式类图代码public class HumanFactory public static Human createHuman(Class c) /定义一个生产出的人种 Huma

5、n human=null; try /产生一个人种 human = (Human)Class.forName(c.getName().newInstance(); catch (Exception e) System.out.println(人种生成错误!); return human; public class NvWa public static void main(String args) /女娲第一次造人,火候不足,缺陷产品 System.out.println(-造出的第一批人是白色人种-); Human whiteHuman = HumanFactory.createHuman(W

6、hiteHuman.class); whiteHuman.getColor(); whiteHuman.talk(); /女娲第二次造人,火候过足,又是次品, System.out.println(n-造出的第二批人是黑色人种-); Human blackHuman = HumanFactory.createHuman(BlackHuman.class); blackHuman.getColor(); blackHuman.talk(); /第三次造人,火候正正好,优品!黄色人种 System.out.println(n-造出的第三批人是黄色人种-); Human yellowHuman =

7、HumanFactory.createHuman(YellowHuman.class); yellowHuman.getColor(); yellowHuman.talk(); 二、 工厂方法模式1、 定义工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。2、 基本原理 工厂方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题。首先完全实现

8、开闭 原则,实现了可扩展。其次更复杂的层次结构,可以应用于产品结果复杂的场合。工厂方法模式对简单工厂模式进行了抽象。有一个抽象的Factory类(可以是抽象类和接口),这个类将不再负责具体的产品生产,而是只制定一些规范,具体的生产工作由其子类去完成。在这个模式中,工厂类和产品类往往可以依次对应。即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。3、 优缺点优点:(1)多态性:客户代码可以做到与特定应用无关,适用于任何实体类。(2)子类提供挂钩,基类为工厂方法提供缺省实现,子类可以重写新的实现,也可以继承父类的实现。- 加一层间接性,增加了灵活性(

9、3)连接并行的类层次结构。(4)良好的封装性,代码结构清晰。(5)扩展性好,在增加产品类的情况下,只需要适当修改具体的工厂类或扩展一个工厂类,就可“拥抱变化”。(6)屏蔽产品类。产品类的实现如何变化,调用者都不需要关心,只需关心产品的接口,只要接口保持不变,系统中的上层模块就不会发生变化。(7)典型的解耦框架。高层模块只需要知道产品的抽象类,其他的实现类都不需要关心,符合迪米特法则,符合依赖倒置原则,符合里氏替换原则。缺点:需要Creator和相应的子类作为factory method的载体,如果应用模型确实需要creator和子类存在,则很好;否则的话,需要增加一个类层次。4、 案例同“简单

10、工厂模式”相同的“女娲造人”的案例,只是此时每个人种都有一个固定的八卦炉,分别造出黑色人种、白色人种、黄色人种。工厂方法模式的类图代码public abstract class AbstractHumanFactory public abstract Human createHuman(); 黑色人种的创建类:public class BlackHumanFactory extends AbstractHumanFactory public Human createHuman() return new BlackHuman(); 黄色人种的创建工厂:public class YellowHum

11、anFactory extends AbstractHumanFactory public Human createHuman() return new YellowHuman(); 白色人种的创建工厂:public class YellowHumanFactory extends AbstractHumanFactory public Human createHuman() return new WhiteHuman(); 场景类NvWa:public class NvWa public static void main(String args) /女娲第一次造人,火候不足,缺陷产品 Sys

12、tem.out.println(-造出的第一批人是白色人种-); Human whiteHuman = (new WhiteHumanFactory().createHuman(); whiteHuman.getColor(); whiteHuman.talk(); /女娲第二次造人,火候过足,又是次品, System.out.println(n-造出的第二批人是黑色人种-); Human blackHuman = (new BlackHumanFactory().createHuman(); blackHuman.getColor(); blackHuman.talk(); /第三次造人,火

13、候正正好,优品!黄色人种 System.out.println(n-造出的第三批人是黄色人种-); Human yellowHuman = (new YellowHumanFactory().createHuman(); yellowHuman.getColor(); yellowHuman.talk(); 三、 抽象工厂模式1、 定义抽象工厂模式Abstract Factory,又称工具箱模式。它提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类 客户端不必指定产品的具体类型,创建多个产品族中的产品对象。2、 基本原理1、基本原理抽象工厂角色(Creator)抽象工厂模式的核

14、心,包含对多个产品结构的声明,任何工厂类都必须实现这个接口具体工厂角色(Concrete Creator)具体工厂类是抽象工厂类的一个实现,负责实例化某个产品族的产品对象 抽象角色(product) 抽象模式所创建的所有对象的父类,它描述所有实例所共有的公共接口 具体产品角色(Concfrete Product) 抽象模式岁创建的具体实例对象3、 优缺点优点:(1) 分离了具体的类,一个工厂封装创建产品对象的责任和过程,它将客户与类的实现分离(2) 易于交换产品系列,只需改变具体的工厂就可以使用不同的产品配置。(3) 有利于产品的一致性,当一个系列中的产品对象被设计成一起工作时,一个应用一次只

15、能使用同一个系列中的对象。缺点:难以支持新的产品等级结构,支持新的产品等级结构就要扩展抽象工厂接口。 4、案例以菜市场里的卖菜为例,一个卖菜的摊主就是一个工厂角色,他卖很多种的菜,比如菜有以下三种: 1.白菜: 白菜现在开始分为:宝坻白菜和静海白菜 2.黄瓜: 黄瓜现在分为:宝坻黄瓜和静海黄瓜 3.西红柿: 西红柿现在也分为:宝坻西红柿和静海西红柿该蔬菜结构就有两个产品族:宝坻蔬菜和静海蔬菜。 这些蔬菜都有一些共同的属性,即 进货时间,产地,价钱,这样就可以建立一个蔬菜的接口,使用UML图描述如下:抽象工厂模式的类图代码蔬菜接口:有如下方法:getPurchaseDate()/获取进货日期,g

16、etOrigin()/获取蔬菜产地,getPrice()/获取价格。使用代码清单就是:public interface Vegetable/*获取进货日期*/ public void getPurchaseDate();/*获取产地*/public void getOrigin();/*获取蔬菜价格*/public void getPrice();接着是三个具体蔬菜类: 白菜抽象角色蔬菜角色:public abstrct class Cabbage implements Vegetable /*获取进货日期*/ public abstrct void getPurchaseDate();/*获

17、取产地*/public abstrct void getOrigin();/*获取蔬菜价格*/public abstrct void getPrice(); 宝地白菜具体类 public class BaoDiCabbage extends Cabbage /*获取进货日期*/ public void getPurchaseDate() System.out.println(“2009-7-25”);/*获取产地*/public void getOrigin()System.outprintln(“宝地”);/*获取蔬菜价格*/public void getPrice() System.out

18、.println(“1.00元/千克”);金海白菜具体类 public class JingHaiCabbage extends Cabbage /*获取进货日期*/ public void getPurchaseDate() System.out.println(“2009-7-24”);/*获取产地*/public void getOrigin()System.outprintln(“金海”);/*获取蔬菜价格*/public void getPrice() System.out.println(“2.00元/千克”);黄瓜的抽象类就是public abstrct class Cucumb

19、er implements Vegetable /*获取进货日期*/ public abstrct void getPurchaseDate();/*获取产地*/public abstrct void getOrigin();/*获取蔬菜价格*/public abstract void getPrice();宝地黄瓜具体类public class BaoDiCucumber extends Cucumber /*获取进货日期*/ public void getPurchaseDate() System.out.println(“2009-7-26”);/*获取产地*/public void g

20、etOrigin()System.outprintln(“宝地”);/*获取蔬菜价格*/public void getPrice() System.out.println(“5.00元/千克”);金海黄瓜具体类public class JingHaiCucumber extends Cucumber /*获取进货日期*/ public void getPurchaseDate() System.out.println(“2009-7-26”);/*获取产地*/public void getOrigin()System.outprintln(“金海”);/*获取蔬菜价格*/public void

21、 getPrice() System.out.println(“5.00元/千克”);西红柿的抽象类就是: public abstract class Tomatoes implements Vegetable /*获取进货日期*/ public void getPurchaseDate();/*获取产地*/public void getOrigin();/*获取蔬菜价格*/public void getPrice();宝地西红柿的实体类就是: public class BaoDiTomatoes extends Tomatoes/*获取进货日期*/ public void getPurcha

22、seDate() System.out.println(“2009-7-23”);/*获取产地*/public void getOrigin()System.outprintln(“宝地”);/*获取蔬菜价格*/public void getPrice() System.out.println(“6.00元/千克”);金海西红柿的实体类就是:public class JingHaiTomatoes extends Tomatoes /*获取进货日期*/ public void getPurchaseDate() System.out.println(“2009-7-23”);/*获取产地*/p

23、ublic void getOrigin()System.outprintln(“金海”);/*获取蔬菜价格*/public void getPrice() System.out.println(“6.00元/千克”);工厂接口类VegetableFactorypublic interface VegetableFactory/实例化白菜public Vegetable getCabbage();/实例化黄瓜public Vegetable getCucumber();/实例化西红柿public Vegetable getTomatoes();金海蔬菜工厂实例化类:public class J

24、ingHaiVegetableFactory implements VegetableFactory/实例化白菜public Vegetable getCabbage() return (Vegetable) new JingHaiCabbage();/实例化黄瓜public Vegetable getCucumber() return (Vegetable) new JingHaiCucumber();/实例化西红柿public Vegetable getTomatoes()return (Vegetable) new JinghaiTomatoes();宝地蔬菜工厂实例化类:public

25、class BaoDiVegetableFactory implements VegetableFactory/实例化白菜public Vegetable getCabbage() return (Vegetable) new BaoDiCabbage();/实例化黄瓜public Vegetable getCucumber() return (Vegetable) new BaoDiCucumber();/实例化西红柿public Vegetable getTomatoes()return (Vegetable) new BaoDiTomatoes();实验环境实验结果与分析通过这次实验我了解了: 简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式。其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性。简单工厂方法 : 用来生产同一等级结构中的任意产品。工厂方法 :用来生产同一等级结构中的固定产品。 抽象工厂:用来生产不同产品族的全部产品。以上三种工厂 方法在等级结构和产品族这两个方向上的支持程度不同。所以要根据情况考虑应该使用哪种方法教师评语注:可根据实际情况加页

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!