版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第八章工厂方法模式常文萃jsjkajia01@163.com第八章工厂方法模式本章教学内容简单工厂模式的计算器工厂方法模式的计算器工厂方法模式举例——雷锋工厂工厂方法模式的意义工厂方法模式中的角色及其结构工厂方法模式的特点工厂方法模式适用环境UML图一、简单工厂模式类的回顾:计算器的设计publicclassOperationFactory
{publicstaticOperationcreateOperate(stringoperate)
{Operationoper=null;switch(operate)
{case"+":oper=newOperationAdd();break;case"-":oper=newOperationSub();break;case"*":oper=newOperationMul();break;case"/":oper=newOperationDiv();break;
}returnoper;
}
}简单工厂模式主函数:usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceFactory_4{classProgram{staticvoidMain(string[]args){Operationoper;oper=OperationFactory.createOperate("+");oper.NumberA=1;oper.NumberB=2;doubleresult=oper.GetResult();Console.WriteLine("结果是:"+result);Console.Read();}}}简单工厂模式的不足在简单工厂模式中,只提供了一个工厂类,该工厂类处于对产品类进行实例化的中心位置,它知道每一个产品对象的创建细节,并决定何时实例化哪一个产品类。最大的缺点是当有新产品要加入到系统中时,必须修改工厂类,加入必要的处理逻辑,这违背了“开闭原则”。
比如,只要把“+”给了工厂,工厂就自动给出了相应的实例。但是,要增加一个“求M数的N次方”的功能,需要在工厂类的方法里加分支条件,修改了已有的工厂类,违反了“开放——封闭原则”。在简单工厂模式中,具体产品与工厂类之间的耦合度高,严重影响了系统的灵活性和扩展性,而工厂方法模式则可以很好地解决这一问题。二、工厂方法模式工厂方法模式——定义一个用于创建对象的接口,让子类决定实例化哪一个类。在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。工厂方法模式解决计算器问题的UML图1.定义计算器类classOperation{privatedouble_numberA=0;privatedouble_numberB=0;publicdoubleNumberA{get{return_numberA;}set{_numberA=value;}}publicdoubleNumberB{get{return_numberB;}set{_numberB=value;}}publicvirtualdoubleGetResult(){doubleresult=0;returnresult;}}classOperationAdd:Operation{publicoverridedoubleGetResult(){doubleresult=0;result=NumberA+NumberB;returnresult;}}classOperationSub:Operation{publicoverridedoubleGetResult(){doubleresult=0;result=NumberA-NumberB;returnresult;}}classOperationMul:Operation{publicoverridedoubleGetResult(){doubleresult=0;result=NumberA*NumberB;returnresult;}}classOperationDiv:Operation{publicoverridedoubleGetResult(){doubleresult=0;if(NumberB==0)thrownewException("除数不能为0。");result=NumberA/NumberB;returnresult;}}2.派生加减乘除类3.构造一个工厂接口interfaceIFactory{OperationCreateOperation();}4.为加减乘除各建一个具体工厂实现接口
classAddFactory:IFactory{publicOperationCreateOperation(){returnnewOperationAdd();}}classSubFactory:IFactory{publicOperationCreateOperation(){returnnewOperationSub();}
}classMulFactory:IFactory{publicOperationCreateOperation(){returnnewOperationMul();}}classDivFactory:IFactory{publicOperationCreateOperation(){returnnewOperationDiv();}}5.客户端程序staticvoidMain(string[]args){IFactoryoperFactory=newAddFactory();Operationoper=operFactory.CreateOperation();oper.NumberA=1;oper.NumberB=2;doubleresult=oper.GetResult();Console.WriteLine(result);Console.Read();}三、雷锋工厂1.
基本方式:薛磊风代表大学生学习雷锋//雷锋classLeiFeng{publicvoidSweep(){Console.WriteLine("扫地");}
publicvoidWash(){Console.WriteLine("洗衣");}
publicvoidBuyRice(){Console.WriteLine("买米");}
}//学雷锋的大学生classUndergraduate:LeiFeng{}
//客户端
staticvoidMain(string[]args)
{LeiFengxueleifeng=newUndergraduate();
xueleifeng.BuyRice();xueleifeng.Sweep();xueleifeng.Wash();}2.三个人代替薛磊风学习雷锋方案1:
LeiFengstudent1=newUndergraduate();student1.BuyRice();LeiFengstudent2=newUndergraduate();student2.Sweep();LeiFengstudent3=newUndergraduate();student3.Wash();存在问题:学生要毕业,所以应定义志愿者类和其对象。方案2://社区志愿者classVolunteer:LeiFeng{}//客户端staticvoidMain(string[]args)
{
LeiFengstudent1=newVolunteer();student1.BuyRice();LeiFengstudent2=newVolunteer();student2.Sweep();LeiFengstudent3=newVolunteer();student3.Wash();}3.
简单工厂模式//雷锋
classLeiFeng{publicvoidSweep(){Console.WriteLine("扫地");}publicvoidWash(){Console.WriteLine("洗衣");}publicvoidBuyRice(){Console.WriteLine("买米");}}//学雷锋的大学生
classUndergraduate:LeiFeng{}//社区志愿者
classVolunteer:LeiFeng{}//简单雷锋工厂
classSimpleFactory{
publicstaticLeiFengCreateLeiFeng(stringtype){LeiFengresult=null;switch(type){case"学雷锋的大学生":result=newUndergraduate();break;case"社区志愿者":result=newVolunteer();break;
}returnresult;}}//客户端staticvoidMain(string[]args){
LeiFengstudentA=SimpleFactory.CreateLeiFeng("学雷锋的大学生");studentA.BuyRice();LeiFengstudentB=SimpleFactory.CreateLeiFeng("学雷锋的大学生");studentB.Sweep();LeiFengstudentC=SimpleFactory.CreateLeiFeng("学雷锋的大学生");studentC.Wash();Console.Read();}存在问题:有三个重复的代码。若要改成自愿者,需要修改三处3.
工厂方法模式//雷锋
classLeiFeng{publicvoidSweep(){Console.WriteLine("扫地");}publicvoidWash(){Console.WriteLine("洗衣");}publicvoidBuyRice(){Console.WriteLine("买米");}}//学雷锋的大学生
classUndergraduate:LeiFeng{}//社区志愿者
classVolunteer:LeiFeng{}
//雷锋工厂
interfaceIFactory{LeiFengCreateLeiFeng();}
//学雷锋的大学生工厂
classUndergraduateFactory:IFactory{publicLeiFengCreateLeiFeng(){returnnewUndergraduate();}}//社区志愿者工厂
classVolunteerFactory:IFactory{publicLeiFengCreateLeiFeng(){returnnewVolunteer();}}//客户端
staticvoidMain(string[]args){
IFactoryfactory=newUndergraduateFactory();LeiFengstudent=factory.CreateLeiFeng();student.BuyRice();student.Sweep();student.Wash();Console.Read();}若要换成“社区自愿者”,只需要修改一处。四、工厂方法模式的意义工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了面向对象的多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。
在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。这个核心类仅仅负责给出具体工厂必须实现的接口,而不负责哪一个产品类被实例化这种细节,当系统扩展需要添加新的产品对象时,仅仅需要添加一个具体产品对象以及一个具体工厂对象,原有工厂对象不需要进行任何修改,也不需要修改客户端,很好地符合了“开闭原则”。即工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。而简单工厂模式在添加新产品对象后不得不修改工厂方法,扩展性不好。工厂方法模式退化后可以演变成简单工厂模式。
五、工厂方法模式中的角色及其结构Product:抽象产品ConcreteProduct:具体产品Factory:抽象工厂ConcreteFactory:具体工厂抽象工厂具体工厂六、工厂方法模式的特点优点:在工厂方法模式中,工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化这一细节,用户只需要关心所需产品对应的工厂,无须关心创
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年基因编辑农业应用报告及未来五至十年精准农业发展报告
- 2026江西宜春上高县招聘看护队员18人备考题库附完整答案详解(名校卷)
- 绥化市2024黑龙江绥化望奎县事业单位招聘工作人员48人笔试历年参考题库典型考点附带答案详解
- 秭归县2023年湖北宜昌市秭归县卫健系统第二批紧缺人才引进6人笔试历年参考题库典型考点附带答案详解
- 盐边县2023四川攀枝花市盐边县事业单位直接考核招聘博士和副高职称及以上高层次人笔试历年参考题库典型考点附带答案详解
- 珠海市2024广东珠海市自然资源局高新分局招聘合同制职员2人笔试历年参考题库典型考点附带答案详解
- 焦作市2024河南省(焦作市)事业单位招聘联考工作122人笔试历年参考题库典型考点附带答案详解
- 深圳市2023年12月广东深圳市光明区科技创新局招聘一般类岗位专干1人笔试历年参考题库典型考点附带答案详解
- 2026财达证券股份有限公司财富管理与机构业务委员会财富管理部招聘6人笔试历年参考题库附带答案详解
- 2026京能技术(北京)有限公司招聘6人笔试历年参考题库附带答案详解
- 售电业务居间服务合同协议
- 毕业设计(论文)-AGV搬运机器人设计-AGV小车
- 2024年浙江出版联团招聘真题
- GB/T 3917.3-2025纺织品织物撕破性能第3部分:梯形试样撕破强力的测定
- DB37-T 4401-2021 养老机构分级护理服务规范
- 2025-2030年中国土砂石开采行业市场竞争格局规划分析报告
- 人机配合安全
- 导数中的同构问题【八大题型】解析版-2025年新高考数学一轮复习
- ANCA相关性小血管炎肾损伤病因介绍
- 旅游行业兼职业务员聘用合同
- (合同范本)中介佣金协议书
评论
0/150
提交评论