软件体系结构实验 设计模式1.docx
- 文档编号:10923635
- 上传时间:2023-02-23
- 格式:DOCX
- 页数:20
- 大小:106.54KB
软件体系结构实验 设计模式1.docx
《软件体系结构实验 设计模式1.docx》由会员分享,可在线阅读,更多相关《软件体系结构实验 设计模式1.docx(20页珍藏版)》请在冰豆网上搜索。
软件体系结构实验设计模式1
课程实验报告
专业年级12软件工程
课程名称软件体系结构
指导教师xxxxxxxx
学生姓名xxxxxxxxx
学号XXXXXXXXXX
实验日期2015.6.3
实验地点笃行楼A栋201
实验成绩
教务处制
20年月日
实验项目
名称
设计模式-1
实验
目的及要求
掌握简单工厂模式.工厂方法模式.抽象工厂模式
实验
内容
运用简单工厂模式.工厂方法模式.抽象工厂模式的基本原理,设计出相应的案例。
实验步骤
一、简单工厂模式
1、定义
简单工厂模式是属于创建型模式,又叫做静态工厂方法(StaticFactoryMethod)模式,但不属于23种GOF设计模式之一。
简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。
简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
2、基本原理
简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。
该模式中包含的角色及其职责
工厂(Creator)角色
简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。
工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。
抽象产品(Product)角色
简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
具体产品(ConcreteProduct)角色
是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。
3、优缺点
优点:
工厂类是整个模式的关键.包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体类的对象.通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可以了。
而不必管这些对象究竟如何创建及如何组织的.明确了各自的职责和权利,有利于整个软件体系结构的优化。
缺点:
由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。
当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利;
4、案例
女娲造人,造人的过程是这样的:
首先,女娲采集黄土捏成人的形状,然后放到八卦炉中烧制,最后放置到大地上生长,烧制过程中出现三种情况:
(1)烧制时间过短,制造出白种人
(2)烧制时间过长,制造出黑种人
(3)烧制时间刚好,制造出黄种人
简单工厂模式类图
代码
publicclassHumanFactory{
publicstaticHumancreateHuman(Class
extendsHuman>c){
//定义一个生产出的人种
Humanhuman=null;
try{
//产生一个人种
human=(Human)Class.forName(c.getName()).newInstance();
}catch(Exceptione){
System.out.println("人种生成错误!
");
}
returnhuman;
}
}
publicclassNvWa{
publicstaticvoidmain(String[]args){
//女娲第一次造人,火候不足,缺陷产品
System.out.println("--造出的第一批人是白色人种--");
HumanwhiteHuman=HumanFactory.createHuman(WhiteHuman.class);
whiteHuman.getColor();
whiteHuman.talk();
//女娲第二次造人,火候过足,又是次品,
System.out.println("\n--造出的第二批人是黑色人种--");
HumanblackHuman=HumanFactory.createHuman(BlackHuman.class);
blackHuman.getColor();
blackHuman.talk();
//第三次造人,火候正正好,优品!
黄色人种
System.out.println("\n--造出的第三批人是黄色人种--");
HumanyellowHuman=HumanFactory.createHuman(YellowHuman.class);
yellowHuman.getColor();
yellowHuman.talk();
}
}
二、工厂方法模式
1、定义
工厂方法(FactoryMethod)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。
核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。
2、基本原理
工厂方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题。
首先完全实现‘开-闭原则’,实现了可扩展。
其次更复杂的层次结构,可以应用于产品结果复杂的场合。
工厂方法模式对简单工厂模式进行了抽象。
有一个抽象的Factory类(可以是抽象类和接口),这个类将不再负责具体的产品生产,而是只制定一些规范,具体的生产工作由其子类去完成。
在这个模式中,工厂类和产品类往往可以依次对应。
即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。
3、优缺点
优点:
(1)多态性:
客户代码可以做到与特定应用无关,适用于任何实体类。
(2)子类提供挂钩,基类为工厂方法提供缺省实现,子类可以重写新的实现,也可以继承父类的实现。
--加一层间接性,增加了灵活性
(3)连接并行的类层次结构。
(4)良好的封装性,代码结构清晰。
(5)扩展性好,在增加产品类的情况下,只需要适当修改具体的工厂类或扩展一个工厂类,就可“拥抱变化”。
(6)屏蔽产品类。
产品类的实现如何变化,调用者都不需要关心,只需关心产品的接口,只要接口保持不变,系统中的上层模块就不会发生变化。
(7)典型的解耦框架。
高层模块只需要知道产品的抽象类,其他的实现类都不需要关心,符合迪米特法则,符合依赖倒置原则,符合里氏替换原则。
缺点:
需要Creator和相应的子类作为factorymethod的载体,如果应用模型确实需要creator和子类存在,则很好;否则的话,需要增加一个类层次。
4、案例
同“简单工厂模式”相同的“女娲造人”的案例,只是此时每个人种都有一个固定的八卦炉,分别造出黑色人种、白色人种、黄色人种。
工厂方法模式的类图
代码
publicabstractclassAbstractHumanFactory{
publicabstractHumancreateHuman();
}
黑色人种的创建类:
publicclassBlackHumanFactoryextendsAbstractHumanFactory{
publicHumancreateHuman(){
returnnewBlackHuman();
}
}
黄色人种的创建工厂:
publicclassYellowHumanFactoryextendsAbstractHumanFactory{
publicHumancreateHuman(){
returnnewYellowHuman();
}
}
白色人种的创建工厂:
publicclassYellowHumanFactoryextendsAbstractHumanFactory{
publicHumancreateHuman(){
returnnewWhiteHuman();
}
}
场景类NvWa:
publicclassNvWa{
publicstaticvoidmain(String[]args){
//女娲第一次造人,火候不足,缺陷产品
System.out.println("--造出的第一批人是白色人种--");
HumanwhiteHuman=(newWhiteHumanFactory()).createHuman();
whiteHuman.getColor();
whiteHuman.talk();
//女娲第二次造人,火候过足,又是次品,
System.out.println("\n--造出的第二批人是黑色人种--");
HumanblackHuman=(newBlackHumanFactory()).createHuman();
blackHuman.getColor();
blackHuman.talk();
//第三次造人,火候正正好,优品!
黄色人种
System.out.println("\n--造出的第三批人是黄色人种--");
HumanyellowHuman=(newYellowHumanFactory()).createHuman();
yellowHuman.getColor();
yellowHuman.talk();
}
}
三、抽象工厂模式
1、定义
抽象工厂模式AbstractFactory,又称工具箱模式。
它提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类–客户端不必指定产品的具体类型,创建多个产品族中的产品对象。
2、基本原理
1、基本原理
抽象工厂角色(Creator)
抽象工厂模式的核心,包含对多个产品结构的声明,任何工厂类都必须实现这个接口
具体工厂角色(ConcreteCreator)
具体工厂类是抽象工厂类的一个实现,负责实例化某个产品族的产品对象
抽象角色(product)
抽象模式所创建的所有对象的父类,它描述所有实例所共有的公共接口
具体产品角色(ConcfreteProduct)
抽象模式岁创建的具体实例对象
3、优缺点
优点:
(1)分离了具体的类,一个工厂封装创建产品对象的责任和过程,它将客户与类的实现分离
(2)易于交换产品系列,只需改变具体的工厂就可以使用不同的产品配置。
(3)有利于产品的一致性,当一个系列中的产品对象被设计成一起工作时,一个应用一次只能使用同一个系列中的对象。
缺点:
难以支持新的产品等级结构,支持新的产品等级结构就要扩展抽象工厂接口。
4、案例
以菜市场里的卖菜为例,一个卖菜的摊主就是一个工厂角色,他卖很多种的菜,比如菜有以下三种:
1.白菜:
白菜现在开始分为:
宝坻白菜和静海白菜
2.黄瓜:
黄瓜现在分为:
宝坻黄瓜和静海黄瓜
3.西红柿:
西红柿现在也分为:
宝坻西红柿和静海西红柿
该蔬菜结构就有两个产品族:
宝坻蔬菜和静海蔬菜。
这些蔬菜都有一些共同的属性,即进货时间,产地,价钱,这样就可以建立一个蔬菜的接口,使用UML图描述如下:
抽象工厂模式的类图
代码
蔬菜接口:
有如下方法:
getPurchaseDate()//获取进货日期,getOrigin()//获取蔬菜产地,getPrice()//获取价格。
使用代码清单就是:
publicinterfaceVegetable{/**获取进货日期**/
publicvoidgetPurchaseDate();/**获取产地**/
publicvoidgetOrigin();/**获取蔬菜价格**/
publicvoidgetPrice();
接着是三个具体蔬菜类:
白菜抽象角色蔬菜角色:
publicabstrctclassCabbageimplementsVegetable{
/**获取进货日期**/
publicabstrctvoidgetPurchaseDate();/**获取产地**/
publicabstrctvoidgetOrigin();/**获取蔬菜价格**/
publicabstrctvoidgetPrice();}
}
宝地白菜具体类
publicclassBaoDiCabbageextendsCabbage{
/**获取进货日期**/
publicvoidgetPurchaseDate(){
System.out.println(“2009-7-25”);}/**获取产地**/
publicvoidgetOrigin(){
System.outprintln(“宝地”);/**获取蔬菜价格**/
publicvoidgetPrice(){
System.out.println(“1.00元/千克”);}
}
金海白菜具体类
publicclassJingHaiCabbageextendsCabbage{
/**获取进货日期**/
publicvoidgetPurchaseDate(){
System.out.println(“2009-7-24”);}/**获取产地**/
publicvoidgetOrigin(){
System.outprintln(“金海”);}/**获取蔬菜价格**/
publicvoidgetPrice(){
System.out.println(“2.00元/千克”);
}
}
黄瓜的抽象类就是
publicabstrctclassCucumberimplementsVegetable{
/**获取进货日期**/
publicabstrctvoidgetPurchaseDate();/**获取产地**/
publicabstrctvoidgetOrigin();/**获取蔬菜价格**/
publicabstractvoidgetPrice();}
宝地黄瓜具体类
publicclassBaoDiCucumberextendsCucumber{
/**获取进货日期**/
publicvoidgetPurchaseDate(){
System.out.println(“2009-7-26”);}/**获取产地**/
publicvoidgetOrigin(){
System.outprintln(“宝地”);}/**获取蔬菜价格**/
publicvoidgetPrice(){
System.out.println(“5.00元/千克”);}
}
金海黄瓜具体类
publicclassJingHaiCucumberextendsCucumber{
/**获取进货日期**/
publicvoidgetPurchaseDate(){
System.out.println(“2009-7-26”);}/**获取产地**/
publicvoidgetOrigin(){
System.outprintln(“金海”);}/**获取蔬菜价格**/
publicvoidgetPrice(){
System.out.println(“5.00元/千克”);}
}
西红柿的抽象类就是:
publicabstractclassTomatoesimplementsVegetable{
/**获取进货日期**/
publicvoidgetPurchaseDate();/**获取产地**/
publicvoidgetOrigin();/**获取蔬菜价格**/
publicvoidgetPrice();
宝地西红柿的实体类就是:
publicclassBaoDiTomatoesextendsTomatoes{
/**获取进货日期**/
publicvoidgetPurchaseDate(){
System.out.println(“2009-7-23”);}/**获取产地**/
publicvoidgetOrigin(){
System.outprintln(“宝地”);}/**获取蔬菜价格**/
publicvoidgetPrice(){
System.out.println(“6.00元/千克”);
}
}
金海西红柿的实体类就是:
publicclassJingHaiTomatoesextendsTomatoes{
/**获取进货日期**/
publicvoidgetPurchaseDate(){
System.out.println(“2009-7-23”);}/**获取产地**/
publicvoidgetOrigin(){
System.outprintln(“金海”);}/**获取蔬菜价格**/
publicvoidgetPrice(){
System.out.println(“6.00元/千克”);}}
工厂接口类VegetableFactory
publicinterfaceVegetableFactory{
//实例化白菜
publicVegetablegetCabbage();
//实例化黄瓜
publicVegetablegetCucumber();
//实例化西红柿
publicVegetablegetTomatoes();}
金海蔬菜工厂实例化类:
publicclassJingHaiVegetableFactoryimplementsVegetableFactory{
//实例化白菜
publicVegetablegetCabbage(){
return(Vegetable)newJingHaiCabbage();}
//实例化黄瓜
publicVegetablegetCucumber(){
return(Vegetable)newJingHaiCucumber();}
//实例化西红柿
publicVegetablegetTomatoes(){
return(Vegetable)newJinghaiTomatoes();}}
宝地蔬菜工厂实例化类:
publicclassBaoDiVegetableFactoryimplementsVegetableFactory{
//实例化白菜
publicVegetablegetCabbage(){
return(Vegetable)newBaoDiCabbage();
}
//实例化黄瓜
publicVegetablegetCucumber(){
return(Vegetable)newBaoDiCucumber();
}
//实例化西红柿
publicVegetablegetTomatoes(){
return(Vegetable)newBaoDiTomatoes();
}
}
实验环境
实验结果与
分析
通过这次实验我了解了:
简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式。
其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性。
简单工厂方法:
用来生产同一等级结构中的任意产品。
工厂方法:
用来生产同一等级结构中的固定产品。
抽象工厂:
用来生产不同产品族的全部产品。
以上三种工厂方法在等级结构和产品族这两个方向上的支持程度不同。
所以要根据情况考虑应该使用哪种方法
教师评语
注:
可根据实际情况加页
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 软件体系结构实验 设计模式1 软件 体系结构 实验 设计 模式
![提示](https://static.bdocx.com/images/bang_tan.gif)