工厂方法模式介绍:
工厂方法模式的意义在于为创建产品对象定义一个工厂接口,并将实际的创建工作推迟到子类。核心工厂类不再负责产品创建,因此核心类变成了一个抽象工厂角色,它只负责特定工厂子类必须实现的接口。进一步抽象的优点是工厂方法模式使系统能够引入新产品,而无需修改特定的工厂角色。
工厂方法模式结构图:
角色分类:
抽象工厂角色:它是工厂方法模式的核心,与应用无关。在模式中创建的任何对象的工厂类都必须实现这个接口。特定工厂角色:这是一个实现抽象工厂接口的特定工厂类,其中包含与应用程序密切相关的逻辑,由应用程序调用来创建产品对象。抽象产品角色:工厂方法模式创建的超类型对象,即产品对象的公共父类或共享接口。在上图中,这个角色是光。特定产品角色:该角色实现抽象产品角色定义的接口。一个特定的产品是由一个特定的工厂创造出来的,往往是一一对应的。
介绍实例:
上一篇博文factory method pattern中,使用factory method模式实现了以下内容:如果有住户管理系统,其中的住户类型是可变的,每个租户类型的租金计算公式是不同的。比如一个类型住户的租金金额=天数*单价业绩* 0.005;b型住户租金金额=月*(月性价比*0.001)虽然我们在这里已经实现了客户的需求,但是如果客户后期需要增加C型店和D型店,并且它们的算法要求不同,那么我们需要创建C型店和D型店,继承Ishop接口,实现里面的方法。同时,我们必须继续修改工厂类,并在switc中添加case来捕获和创建相应的存储对象。一旦它们出现,
1.分析:门店有共同的行为特征,都要计算门店租金。我们抽象出在Ishop中实现的计算店铺租金的方法行为。
使用系统;使用系统。集合。通用;使用系统。Linq使用系统。文字;命名空间FactoryEntiy {公共接口Ishop { double Getrent(int days,double dayprice,double performance);}}2.我们在Isho接口中实现了该方法,并创建了A和B存储。
使用工厂使用系统;使用系统。集合。通用;使用系统Linq .使用系统。文字;命名空间ProductEntity {///summary///继承商店接口,实现里面的行为方法,即算法////摘要公开课Ashop:Ishop { ///摘要///////A类型商店租金额,天数*单价绩效* 0.005////summary///param name=' days '天数/param ///param name='dayprice '每天单价/param///param name=' performance '日平均绩效/param///returns/returns public double Getrent(int days,double dayprice,double performance) { Console .写线('一商店的租金算法');退货天数*日价格表现* 0.01;} } }使用工厂使用系统;使用系统。集合。通用;使用系统Linq .使用系统。文字;命名空间ProductEntity {///summary///继承商店接口,实现里面的行为方法,即算法////摘要公共类Bshop:Ishop { ///摘要////B类型商店的租金=月份*(每月价格performance * 0.001)////summary///param name=' month '月数/param ///param name='monthprice '月单价/param///param name=' performance '月平均绩效/param///returns/returns public double Getrent(int month,double monthprice,double performance) { Console .写线(' B商店的租金算法');回报月*(月绩效* 0.001);} }}3.现在考虑在什么情况下创建商店的实体,对不同的商店进行租金计算,并且方便以后的增加和修改。于是我们创建电子接口,里面有待实现的创建商店对象的方法。
使用工厂使用系统;使用系统。集合。通用;使用系统Linq .使用系统。文字;命名空间FactoryMethod{ ///summary ///工厂类,创建商店类型实体////摘要公共接口IFactory { Ishop create shop();}}4.现在我们就可以继承自如果工厂,实现里面创建对应的商店对象了。
使用工厂使用工厂方法;使用产品属性使用系统;使用系统。集合。通用;使用系统Linq .使用系统。文字;命名空间ProductEntity {///summary///继承工厂类,创建A类型商店实体////摘要公共类create bshop : iFactory { public Ishop create shop(){ return new Ashop();} } }使用工厂使用工厂方法;使用产品属性使用系统;使用系统。集合。通用;使用系统Linq .使用系统。文字;命名空间ProductEntity {///summary///继承工厂类,创建B类型商店实体////摘要公共类create ashop : IFactory { public Ishop create shop(){ return new Bshop();} }}5.之后根据当前的商店类型进行判断,该类型的商店应该进行哪一种算法:
使用FactoryEntiy使用系统;使用系统。集合。通用;使用系统。配置;使用系统。Linq使用系统。反思;使用系统。文字;命名空间工厂方法。app { class Program { static void Main(string[]args){ string shop name=configuration manager。AppSettings[' CreateShopClassName '];//shopname是创建商店的类的名称,其中=创建商店ifactoraf=(ifactory)程序集。负载(“生产率”)。create instance(' performance ')shop name);//第一个可生产性是dll的名称,第二个可生产性是项目的命名空间。Ishop As=af。CreateShop();双倍总计=As。Getrent(30,300,2000);//30天/100元内日均表现为2000 Console。WriteLine('这个A型店的租金是:'合计');控制台。write line('==============');工厂bf=(工厂)组件。加载(' ProductEnity ')。create instance(' ProductEntity ')CreateBshop’);//CreateBshop可以保存为配置,也可以存储在数据库中。//请注意,保存的字符串应该与项目中创建的类名相同。//否则反射找不到项目下的类。Ishop Bs=bf。CreateShop();总计=Bs。Getrent(30,300,2000);//30天/100元内日均表现为2000 Console。WriteLine('这个A型店的租金是:'合计');}}}这里我们使用反射来创建对象,取代了之前工厂类通过switch来创建对象的方式,有利于新增类型存储后项目需求的变化以及算法的修改和维护。我们只需要在项目中再次添加C和D类型存储,继承Ishop实现中的方法,并添加和继承ifelectronic接口。创建相应的store对象来编译项目的ProductEnity.dll,然后再进行计算。C,D型存储算法可以通过反射计算,而无需修改原始工程代码。
整个项目的结构图如下:
以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。