二、工厂方法模式的实现
工厂方法模式之所以能够解决简单工厂模式,是因为它的实现将具体产品的创建推迟到了子类。此时工厂类不再负责所有产品的创建,而只给出具体工厂必须实现的接口,这样工厂方法模式就可以让系统在不修改工厂类逻辑的情况下添加新的产品,从而克服了简单工厂模式的缺点。我们看一下工厂模式的具体实现代码(这里仍然使用简单工厂模式中点菜的例子来实现):
命名空间设计模式工厂方法模式{ ///摘要///Vegetable Abstract Class ////summary public abstract class Food { //输出点了什么菜public Abstract void Print(); } ///摘要///番茄炒蛋菜////summary public class TomatoScrambledEggs : Food { public override void Print() { Console.WriteLine('番茄炒蛋准备好了!'); } } ///摘要///土豆丝肉丝这道菜////摘要public class ShreddedPorkWithPotatoes : Food { public override void Print() { Console.WriteLine('土豆准备好了'); } } } ///摘要///抽象工厂类////摘要public abstract class Creator { //工厂方法public abstract Food CreateFoddFactory(); } ///摘要///番茄炒蛋工厂类////summary public class TomatoScrambledEggsFactory:Creator { ///摘要///负责创建番茄炒蛋蛋菜////summary ///returns/returns public override食物CreateFoddFactory() { return new TomatoScrambledEggs(); } } ///摘要///土豆丝肉丝工厂类////summary public class ShreddedPorkWithPotatoesFactory:Creator { ///摘要///负责创建肉丝土豆丝这道菜////summary ///returns/返回公共重写Food CreateFoddFactory() { return new ShreddedPorkWithPotatoes(); } } ///摘要///客户客户端调用////summary class Client { static void Main(string[] args) { //初始化两个烹饪工厂() Creator shreddedPorkWithPotatoesFactory=new ShreddedPorkWithPotatoesFactory();创建者tomatoScrambledEggsFactory=new TomatoScrambledEggsFactory(); //开始制作番茄炒蛋食物tomatoScrambleEggs=tomatoScrambledEggsFactory.CreateFoddFactory(); tomatoScrambleEggs.Print(); //开始制作土豆丝Food shreddedPorkWithPotatoes=shreddedPorkWithPotatoesFactory.CreateFoddFactory(); shreddedPorkWithPotatoes.Print();控制台.Read(); } } }
对于使用工厂方法实现的系统,如果系统需要增加新的产品,我们可以利用多态性来完成系统的扩展,而不需要对抽象工厂类或具体工厂中的代码进行任何改动。比如我们还想点“肉末茄子”。这时我们只需要定义一个猪肉茄子具体工厂类和一个猪肉茄子类即可。而不是像简单工厂模式那样修改工厂类中的实现(特别是添加case 语句)。具体代码为:
///摘要///肉末茄子菜肴////summary public class MincedMeatEggplant : Food { ///摘要///重写抽象类中的方法////summary public override void Print() { Console.WriteLine( '肉末和茄子准备好了'); } } ///摘要///肉末茄子工厂类负责创建肉末茄子菜肴////summary public class MincedMeatEggplantFactory : Creator { ///摘要///负责创建肉末茄子和茄子菜////summary ///returns/returns public override Food CreateFoddFactory() { return new MincedMeatEggplant(); } } ///摘要///客户端调用//////summary class Client { static void Main(string[] args) { //如果顾客想再次点肉末和茄子//初始化另一个肉末并茄子工厂创建者minceMeatEggplantFactor=new MincedMeatEggplantFactory(); //使用碎肉茄子工厂创建碎茄子菜肴Food minceMeatEggplant=minceMeatEggplantFactor.CreateFoddFactory(); minceMeatEggplant.Print();控制台.Read(); } }
三、工厂方法模式的UML图
解释完工厂模式的具体实现之后,我们看一下工厂模式中各个类型之间的UML图:
从UML图中可以看出,在工厂方法模式中,工厂类和具体产品类具有并行的层次结构,并且它们之间存在一一对应的关系。 UML图的解释如下:
Creator 类:充当抽象工厂。任何具体工厂都必须继承这个抽象类。
TomatoScrambledEggsFactory 和ShreddedPorkWithPotatoesFactory 类:充当特定工厂来创建特定产品
食品类:扮演抽象产品的角色,是具体产品的抽象类。任何具体产品都应该继承这个类
TomatoScrambledEggs 和ShreddedPorkWithPotatoes 类:充当具体产品角色,实现抽象产品类定义的抽象方法,并由具体工厂类创建。它们之间存在一一对应的关系。
四、.NET中实现了工厂方法的类
.NET 类库中还有许多实现工厂方法的类。例如,在Asp.net中,handler对象专门用于处理请求。当我们请求一个*.aspx文件时,它会被映射到System.Web.UI.PageHandlerFactory类进行处理,而对*.ashx的请求会被映射到System.Web.UI.SimpleHandlerFactory类(两个类都继承来自IHttpHandlerFactory 接口)。关于这一点,我们可以在“C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\Web.Config”文件中找到相关定义。具体定义如下:
httpHandlersadd path='*.axd' verb='*' type='System.Web.HttpNotFoundHandler' validate='True'/add path='*.aspx' verb='*' type='System.Web.UI。 PageHandlerFactory' validate='True'/add path='*.ashx' verb='*' type='System.Web.UI.SimpleHandlerFactory' validate='True' //httpHandlers 我们来仔细看看工厂方法模式在Asp.net中它是如何实现的?如果请求的是Index.aspx 页面,则将调用PageHandlerFactory 中的GetHandler 方法来创建Index.aspx 对象。它们之间的类图关系如下:
标题:C#设计模式(三)工厂方法模式
链接:https://www.gbbxw.com/news/rj/20565.html
版权:文章转载自网络,如有侵权,请联系删除!
用户评论
这个关于工厂方法模式的游戏,很好地将编程实践融入到了游戏中,让玩家在玩的同时学到新的软件设计原则。
有13位网友表示赞同!
我真的很喜欢《C#设计模式》系列的这个游戏!它以一种令人着迷的方式引入了工厂方法模式的概念。
有15位网友表示赞同!
"C#设计模式"游戏中的每一步都深入浅出地讲解了这个重要的软件工程工具,使得游戏既有趣又具有教育意义。
有14位网友表示赞同!
通过游戏化学习,我在《C#设计模式》里的"工厂方法模式"部分找到了一个独特的理解软件架构的方式。游戏让我更加沉浸其中。
有13位网友表示赞同!
"C#设计模式"的这一关特别详细地解释了工厂方法和抽象工厂的区别和用法,对新开发者非常友好。
有12位网友表示赞同!
在完成《C#设计模式》的游戏任务时学习工厂方法模式真的很棒!这种交互方式大大提高了我的理解速度。
有7位网友表示赞同!
我强烈推荐给任何想在游戏中探索并掌握"工厂方法模式"的程序员,《C#设计模式》系列是一个很好的起点。
有19位网友表示赞同!
"C#设计模式"游戏使用生动的例子,帮助我对工厂方法的概念有了深刻的理解和记忆。
有8位网友表示赞同!
游戏中关于"工厂方法模式"的挑战很妙,它既让我放松又学到了实用的技术知识。
有13位网友表示赞同!
《C#设计模式》是一个充满乐趣的学习之旅。其中的"工厂方法模式"部分帮我克服了编程上的难关。
有8位网友表示赞同!
我通过在游戏中的实践,了解到如何在现实世界中应用工厂方法模式来优化代码结构。
有15位网友表示赞同!
对于那些希望在游戏中提升其软件工程技能的人来说,《C#设计模式》系列中的"工厂方法模式"部分是一个完美的选择。这款游戏让我爱不释手的同时学会了新技术。
有19位网友表示赞同!
这款游戏中的"工厂方法模式"教得非常清楚,我感觉自己不仅学到了知识,还提高了思考问题的方式。
有12位网友表示赞同!
《C#设计模式》不仅给了我实践编程的好机会,在游戏过程中学习到的东西对我在项目中的应用十分有帮助。
有7位网友表示赞同!
虽然作为新入行的开发者一开始玩这个游戏很挑战,但"工厂方法模式"部分帮我构建了坚实的编程基础。
有13位网友表示赞同!
我喜欢在《C#设计模式》游戏中如何逐步深入地理解和使用工厂方法,让抽象概念生动起来。
有14位网友表示赞同!
"C#设计模式"游戏将"工厂方法模式"的乐趣与学习完美结合,这种沉浸式的教育方式真的很吸引人。
有18位网友表示赞同!
在游戏中解决"工厂方法模式"的问题时所获得的成就感无与伦比,我从中获得了极大的满足感和动力。
有13位网友表示赞同!
"C#设计模式"中的这一部分用一种独特且直观的方式来教授编程概念,特别是对于像我这样的学习者来说非常有益。
有16位网友表示赞同!
《C#设计模式》不仅帮助我在游戏中成长,而且对我的实际项目开发也产生了积极影响。工厂方法模式的讲解清晰易懂。
有20位网友表示赞同!
我很享受通过游戏探索并掌握"工厂方法模式"的过程,感觉这样将理论知识与实践紧密结合的学习方式非常有效。
有11位网友表示赞同!