NET工厂方法模式解释
工厂方法模式介绍:
工厂方法模式是一种创造性模式,也称为静态工厂方法模式,但它不属于23个GOF设计模式之一。工厂方法模式是工厂对象决定创建哪种产品类的实例。工厂方法模式是工厂模型族中最简单、最实用的模型,可以理解为不同工厂模型的特殊实现。
结构模式图:
角色分类:
Creator的角色是工厂方法模式的核心,负责实现创建所有实例的内部逻辑。创建工厂类的产品类的方法可以被外界直接调用来创建所需的产品对象。
抽象产品角色是工厂方法模式创建的所有对象的父类,负责描述所有实例共享的公共接口。
具体产品的角色是工厂方法模式的创建目标,所有创建的对象都是作为这个角色的具体类的实例。
介绍实际情况:
如果有住户管理系统,其中的住户类型是可变的,每个租户类型的租金计算公式是不同的
键入一户租金金额=天数*单价绩效*0.005
b类住户租金金额=月*(月性价比*0.001)
分析:
1.商店有一个通用的计算方法,这就是实体商店的行为,但是它们的行为是不同的,所以我们抽象商店类,代码如下:
使用系统;使用系统。集合。通用;使用系统。Linq使用系统。文字;命名空间SimpleFactory。App . IFactroy {公共接口Ishop { double Getrent(int days,double dayprice,double performance);}}2.在对商店进行抽象之后,我们需要创建一个特定的产品类,这里是特定类型的商店,它实现了商店的行为方法。创建一个类型为a的商店。
使用简单工厂。应用电子;使用系统;使用系统。集合。通用;使用系统。Linq使用系统。文字;创建命名空间简单工厂类型的存储。App。产品{//A公版A类店铺: iShop {///Summary//////A店铺租金金额,天数*单价业绩* 0.005/////Summary//param name=' Days ' Days/param///param name=' day price '日单价/param///param name=' performance '日平均业绩/param///Returns/Returns Public double get rent(int Days,double day price,double performance) {console。writeline('一种商店租金算法');退货天数*日价格表现* 0.01;} }}3.创建一个B型商店:
使用简单工厂。应用电子;使用系统;使用系统。集合。通用;使用系统。Linq使用系统。文字;命名空间simple factory . app . product {///summary////创建b类店铺////summary public class b shop : ishop {///summary////b类店铺的租金=月*(月平均价格绩效* 0.001)/////summary//param name='月'月/param ///param name='monthprice '月单价/param ///param name='绩效'月平均绩效/param///Returns/Returns public double getrent(int,monthwriteline ('b店租金算法');回报月*(月绩效* 0.001);} }}4.在创建了数字类型存储并实现了方法之后,想想在什么情况下如何创建那个对象,于是工厂方法模式的核心部分:工厂类就出来了
使用简单工厂。应用电子;使用简单工厂。App.product使用系统;使用系统。集合。通用;使用系统。Linq使用系统。文字;命名空间SimpleFactory。app . factory method { public class factory method { public Ishop create show(字符串显示){ switch(显示。修剪()。ToLower()) { case'ashop':返回new Ashop();case 'bshop':返回new Ashop();Default:引发新的异常(“存储不存在”);}} }}5.然后,根据当前商店类型,判断应该在这种类型的商店中执行哪种算法:
使用简单工厂。App.factoryMethod使用简单工厂。应用电子;使用系统;使用系统。集合。通用;使用系统。Linq使用系统。文字;命名空间SimpleFactory。app { class Program { static void Main(string[]args){ Ishop As;factory method AFM=new factory method();As=afm。CreateShow(' ashop ');//a型店双倍合计=as.getrent (30,300,2000);//30天/100元内日均表现为2000 Console。WriteLine('这个A型店的租金是:'合计');控制台。write line('==============');Ishop Bsfactory method BFM=new factory method();Bs=bfm。CreateShow(' bshop ');//b类商店总计=Bs。getrent(33000,60000);//3月/4000元,月均表现6万Console。WriteLine('这个B型店的租金是:'合计');控制台。ReadKey();}}}这里我们已经实现了客户要求的两类门店的算法需求,但作为一个好的设计架构,也要考虑后期的需求变化。如果客户现在增加了C型店和D型店,他们的算法要求不一样,那么我们需要创建C型店和D型店,继承Ishop接口,实现里面的方法。同时,我们还要继续修改factory类,在switc中添加case来捕获和创建相应的store对象。一旦出现这种情况,不利于程序的可扩展性和项目后期的可维护性。
优点:
工厂方法模式可以根据外界给出的信息来决定应该创建哪个特定的对象类。通过它,外界可以摆脱直接创造具体产品对象的尴尬局面。外界与具体阶层隔绝,耦合度低。明确区分各自的职责和权限,有利于整个软件架构的优化。缺点:
Factory类集中了所有实例的创建逻辑,这很容易违反GRASPR的高度内聚的责任分配原则。虽然工厂方法模式可以适应某些变化,但它能解决的问题是非常有限的。它能创建的类只能提前考虑。如果需要添加新的类,需要更改工厂类。如何解决申诉情况值得思考,并将在下一个工厂方法模式中得到很好的解决。
以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。
版权声明:NET工厂方法模式解释是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。