




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第八章工厂方法模式常文萃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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五版债权转股权合同
- 二零二五房地产估价委托协议合同书范文
- 借款居间服务合同及借款合同二零二五年
- 出租车司机聘用协议书二零二五年
- 土地拍卖转让协议书
- 公司投资公司合作合同范例二零二五年
- 2025工程项目承包合同(合同范本)
- 2025年版场地租赁合同范本
- 2025商业贷款质押合同
- 吸氧并发症及护理措施
- 胆管癌术后护理病例讨论
- WMT8-2022二手乘用车出口质量要求
- 大学《思想道德与法治》期末考试复习题库(含答案)
- 钦州市充电站建设计划书
- 婚纱行业基础知识培训课件
- 智能灯具故障排除方案
- 《少先队员采茶歌》课件
- 新外研版高一英语必修二unit6课文
- 气排球比赛积分表
- 20道瑞幸咖啡营运经理岗位常见面试问题含HR常问问题考察点及参考回答
- 急性心力衰竭中国急诊管理指南2022
评论
0/150
提交评论