




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第八章工厂方法模式常文萃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(统编版)语文必修上册第二单元大单元教学设计
- 精细研究CPSM考试试题及答案集
- 2024国际物流师的就业市场调查与试题及答案
- 预防近视呵护眼睛课件
- CPMM考试指南:一站式参考试题及答案
- 2024年CPSM人员素质要求试题及答案
- 2024年CPMM试题及答案全方位指南
- 能源管理体系建设指导材料之13:6策划-6.6能源数据收集的策划(雷泽佳编制-2025A0)
- 肇庆市高中毕业班2025届高三最后一模化学试题含解析
- ISO27001信息安全管理体系培训资料
- GB/T 39560.2-2024电子电气产品中某些物质的测定第2部分:拆解、拆分和机械制样
- 语文-山东省济南市2024-2025学年高中三年级九月摸底考试(暨开学考)试题和答案
- 内部设施零星维修服务 投标方案(技术方案)
- 糖尿病足溃疡创面治疗专家共识
- 输变电工程施工质量验收统一表式附件1:线路工程填写示例
- 陕西省2024年高中学业水平合格考数学试卷试题(含答案)
- 血液透析室内瘘针滑脱pdca汇报
- 水利安全生产风险防控“六项机制”右江模式经验分享
- FZ∕T 25005-2021 底网造纸毛毯
- ti-84计算器说明书
评论
0/150
提交评论