设计模式4Factory Method(工厂方法)

上传人:fgh****35 文档编号:172625015 上传时间:2022-12-05 格式:DOCX 页数:4 大小:43.79KB
返回 下载 相关 举报
设计模式4Factory Method(工厂方法)_第1页
第1页 / 共4页
设计模式4Factory Method(工厂方法)_第2页
第2页 / 共4页
设计模式4Factory Method(工厂方法)_第3页
第3页 / 共4页
点击查看更多>>
资源描述
无废话C#设计模式之四:Factory Method意图定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。场景上次,我们使用抽象工厂解决了生产一组产品的问题,但是我们把各个场景作为了具体工厂来生产场景模式和场景纹理两个产品。在调用代码中也并没有出现具体工厂的影子。其实,场景类要做的不仅仅是创建具体的产品系列,可能它还需要做一个初始化工作。那么,我们就需要在调用代码中能得到这个场景类。在前一节中,由于场景类(比如HalfPaper)本身是具体级别的(具体工厂)。那么,我们也不应该在调用代码中直接依赖场景类。因此,我们可以使用工厂方法来生产这个具体产品。示例代码using System;using System.Reflection;namespace FactoryMethodExample class Program static void Main(string args) Patrix patrix = new Patrix(); patrix.LoadScene(HalfPaper); patrix.LoadScene(Matrix); class Patrix private PatrixSceneFactory GetGameScene(string gameSceneName) return (PatrixSceneFactory)Assembly.Load(FactoryMethodExample).CreateInstance(FactoryMethodExample. + gameSceneName + Factory); public void LoadScene(string gameSceneName) PatrixSceneFactory psf = GetGameScene(gameSceneName); PatrixScene ps = psf.CreateScene(); ps.InitScene(); abstract class PatrixSceneFactory public abstract PatrixScene CreateScene(); abstract class PatrixScene public void InitScene() Texture texture = CreateTexture(); Model model = CreateModel(); model.FillTexture(texture); public abstract Model CreateModel(); public abstract Texture CreateTexture(); abstract class Model public abstract void FillTexture(Texture texture); abstract class Texture class HalfPaperFactory : PatrixSceneFactory public override PatrixScene CreateScene() return new HalfPaper(); class HalfPaper : PatrixScene public HalfPaper() Console.WriteLine(HalfPaper Creating); public override Model CreateModel() return new HalfPaperModel(); public override Texture CreateTexture() return new HalfPaperTexture(); class HalfPaperModel : Model public HalfPaperModel() Console.WriteLine(HalfPaper Model Creating); public override void FillTexture(Texture texture) Console.WriteLine(HalfPaper Model is filled Texture); class HalfPaperTexture : Texture public HalfPaperTexture() Console.WriteLine(HalfPaper Texture Created); class MatrixFactory : PatrixSceneFactory public override PatrixScene CreateScene() return new Matrix(); class Matrix : PatrixScene public Matrix() Console.WriteLine(Matrix Created); public override Model CreateModel() return new MatrixModel(); public override Texture CreateTexture() return new MatrixTexture(); class MatrixModel : Model public MatrixModel() Console.WriteLine(Matrix Model Created); public override void FillTexture(Texture texture) Console.WriteLine(Matrix Model is filled Texture); class MatrixTexture : Texture public MatrixTexture() Console.WriteLine(Matrix Texture Created); 代码执行结果如下图:代码说明l 这个代码基于前一节抽象工厂的代码修改而来,因此代码比较厂。其中能体现的设计模式有抽象工厂、工厂方法以及模版方法。l 这次的PatrixSceneFactory和前一节的不同,它是一个产品的抽象工厂,也就是工厂方法模式中的抽象工厂角色,它是具体产品工厂的抽象形式。l HalfPaperFactory和MatrixFactory是工厂方法模式中的具体工厂角色,它负责创建具体的产品。l PatrixScene是工厂方法模式中的抽象产品角色,同时也是抽象工厂模式中的抽象工厂角色。它既是场景的抽象形式,又负责创建每个场景中的产品系列,也就是模型和纹理。还有,它的InistScene()方法还体现了模版方法的思想,封装了产品初始化过程中的共同步骤。l HalfPaper和Matrix当然就是工厂方法模式中的具体产品角色了,同时,它们也是抽象工厂模式中的具体工厂角色。l 从这个例子可以看出,抽象工厂针对一组产品的创建进行抽象,抽象程度比较高。抽象工厂生产重点在于规范一组产品的创建,能让产品线保持产品的一致。比如,N卡不管是7系列还是8系列,总会分低端的7300,8300和中端的7600,8600以及高端的7900,8900。l 而工厂方法针对某种产品的创建,每种产品在创建的过程中可能会有一些相似的步骤,那么就可以在抽象产品中进行一些提取,自然而然运用到了模版方法。工厂方法还能针对具体产品创建时的易变性,在这里我们可能很清楚HalfPaperFactory一定会创建HalfPaper这个产品,但是万一以后改为创建HalfPaperSpecial了呢?有了工厂方法,我们可以只需修改HalfPaperFactory就可以了。l 不管怎么样,目的还是让调用方尽量和接口依赖(或者说和稳定的东西去依赖,让变化在接口下面变),既是要以来具体类型,也希望能只依赖一个。试想一下,如果没有抽象工厂和工厂方法,也少了这些抽象类型,那么调用方可能就要依赖具体场景类型和具体的纹理以及模型类型。并且在调用的时候,通过条件来判断并且创建各种具体类型,一旦有新的场景需要实现,调用方代码可能就需要做很大的调整。暂且不说调整的工作量有多少,调整所带来的风险谁能承担呢?何时采用l 从代码角度来说, 如果我们需要创建一个易变的对象,或是希望对象由子类决定创建哪个对象的时候可以考虑工厂方法。l 从应用角度来说, 如果我们觉得具体产品的创建不稳定,或者客户端根本无需知道创建哪个具体产品的时候可以使用工厂方法。后者对于框架和工具包软件来说更常见,比如有一个打印类负责打印图纸,我们需要得到一个打印对象,对于调用方来说并不知道要使用超宽打印对象还是普通打印对象,我们可以通过工厂方法使客户端和抽象打印工厂直接沟通,由它来决定具体创建哪个打印对象。实现要点l 通过继承创建具体产品。很多时候,每一种具体产品对应一个具体的工厂来创建。l 使用具体工厂类来决定怎么样创建具体产品。调用方并不关心工厂创建的是哪个游戏场景,它只用知道工厂给我的是一个游戏场景即可。注意事项l 工厂方法通常需要为每个具体产品对应一个具体工厂,如果滥用的话会使得类的数目急剧增多。本人初学设计模式,想问一下,如果把Patrix修改成如下的话,那PatrixSceneFactory类就需要了,那为什么要像楼主一样设计PatrixSceneFactory类呢 class Patrix private PatrixScene GetGameScene(string gameSceneName) return (PatrixScene)Assembly.GetAssembly(typeof(PatrixScene).CreateInstance(ConsoleApplication6. + gameSceneName ); public void LoadScene(string gameSceneName) PatrixScene ps = GetGameScene(gameSceneName); ps.InitScene(); 对于 abstract class PatrixScene 我认为主要使用类似上一个模式中的抽象工厂, 只是多了一个INIT 方法, 而这个INIT方法是使用就是对产品组装的一个提取. 具然组装方式已经有了, 此类中的其两个方法, 使用PROTECTED 来的比较合适, 无需让客户端调用这些方法. 同时对于每个具体的产品, 可能会存在各自的组装方式, 所以我建议是否考虑在INIT 方法上加个修改饰符 vitural , 可让各个产品自行组装.
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 商业管理 > 营销创新


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!