




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
.NET设计模式(3): 抽象工厂模式 抽象工厂模式(Abstract Factory Pattern)引入:在前面介绍的两个创建型模式里面,我们解决的都是有关new的问题,用它们来避免显式指定类创建对象。我写的也非常简单易懂,相信看过的朋友们都应该对简单工厂模式、工厂方法模式的意图、所能解决的问题及适用情景有一定的了解了。但是若要达到灵活运用,什么时候用,怎样用合适还不是看一篇文章就能解决的问题。呵呵.这需要你对OO的理解程度,你的项目开发经验等等许多方面的积累。一起努力喔。好了,咱们言归正传,通过对这两个模式的了解,我们掌握一种思想,就是在创建一个对象时,需要把容易发生变化的地方给封装起来,来控制变化(哪里变化,封装哪里),以适应客户的变动,项目的扩展。但是,我们在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作,同时由于需求的变化,这“一系列相互依赖的对象”也要改变,如何应对这种变化呢?如何像简单工厂模式、工厂方法模式一样绕过常规的new,然后提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合?可能有人会说,你也可以将这些对象一个一个通过工厂方法模式来解决呀?但是,我们试想,既然是一系列相互依赖的对象,它们是有联系的,每个对象都这样解决,你又如何来保证他们的联系呢?举一个例子:Windows桌面主题,当你更换一个桌面主题的时候,系统的开始按钮、任务栏、菜单栏、工具栏等等都变了,而且是一起变的,他们的色调都还很一致,难道类似这样的问题,怎么来解决呢?它的天敌就是抽象工厂模式。意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。参考者:也就是该模式中的各个类或对象之间的关系: 抽象工厂(Abstract Factory)声明生成一系列抽象产品的方法 具体工厂(Concrete Factory)执行生成一系列抽象产品的方法,生成一系列具体的产品 抽象产品(Abstract Product)为这一系列的某一种产品声明接口 具体产品(Product)定义具体工厂生成的具体产品的对象,实现产品接口 客户(Client)我们的应用程序客户端(不要理解成人),使用抽象产品和抽象工厂生成对象。 抽象工厂模式UML图抽象工厂模式在生活中的实例咱们继续拿怎么穿衣服来说明这个抽象工厂模式。就拿你来说吧。工作了,为了参加一些聚会,肯定有两套或多套衣服吧,比如说有商务装(成套,一系列具体产品)、时尚装(成套,一系列具体产品),甚至对于一个家庭来说,可能有商务女装、商务男装、时尚女装、时尚男装,这些也都是成套的,即一系列具体产品。咱们假设一种情况(现实中是不存在的,要不然,没法进入共产主义了,但有利于说明抽象工厂模式),在你的家中,某一个衣柜(具体工厂)只能存放某一种这样的衣服(成套,一系列具体产品),每次拿这种成套的衣服时也自然要从这个衣柜中取出了。用OO的思想去理解,所有的衣柜(具体工厂)都是衣柜类的(抽象工厂)某一个,而每一件成套的衣服又包括具体的上衣(某一具体产品),裤子(某一具体产品),这些具体的上衣其实也都是上衣(抽象产品),具体的裤子也都是裤子(另一个抽象产品)。分析:要好好去读上面那个实例,虽然有点绕嘴,其实只要用心去读,分清了抽象工厂模式的各个角色,对理解设计模式是非常重要的。理解头绪,然后接合简单工厂模式、工厂方法模式对工厂家族的了解,再加上抽象工厂模式的意图,头脑中差不多有一个雏型了吧。好了,咱们一起来分析一下。先把各个角色揪出来。抽象工厂:虚拟的衣柜,它只是个概念而已。在项目中可能是一个接口或抽象类,定义规则,取出上衣,裤子。具体工厂:具体的存在的衣柜,它用于存放某一种成套的衣服,换句话说,这种成套的衣服都是从这个衣柜中取出的。在项 目中继承于抽象工厂,实现抽象工厂中的方法,取出具体产品,某一件上衣,某一条裤子。抽象产品:虚拟的衣服,也只是个概念。在项目中可能是多个接口或抽象类,定义规则,有什么特性,起什么作用。具体产品:具体的实际存在的产品,它指的就是用于组装成某一套衣服的某一件上衣或裤子。它继承自某一个抽象产品。实现抽象产品中制定的规则,特性。它们之间怎么联系呢?客户在用的时候,依赖的又是什么呢?客户在要的时候,首先要说出你要的什么系列的衣服,然后根据它的要求生成一个具体工厂的实例,剩下的工作就都是这个倒霉的具体工厂了,它会根据自己的实现生成一个上衣,生成一个裤子,然后把它交给客户。客户在这一过程中并不知道具体工厂都做了什么。也就是说,客户只依赖于抽象工厂和抽象产品了。在初始化的时候会用到一次具体工厂类名,我们根据.NET特有的反射机制又可以把这个在客户端唯一的具体的非抽象类放到一个应用程序配置文件中,防止它变化。这就符合了设计模式中的“开放-封闭”原则,依赖倒转原则,里氏代换原则等等。具体代码如下:抽象工厂角色:1namespaceAbstractFactory23/抽象工厂类,4publicabstractclassAbstractClothes56/抽象方法:创建一个上衣7abstractpublicAbstractCoatCreateCoat();8/抽象方法:创建一个裤子9abstractpublicAbstractTrousersCreateTrousers();101112抽象产品角色:1namespaceAbstractFactory23/*/4/抽象产品-上衣抽象类5/6publicabstractclassAbstractCoat78/性别属性9publicabstractboolSex1011get;121314/样式属性15publicabstractstringStyle1617get;18192021/*/22/抽象产品-裤子抽象类23/24publicabstractclassAbstractTrousers2526/性别属性27publicabstractboolSex2829get;303132/样式属性33publicabstractstringStyle3435get;36373839具体工厂角色:1namespaceAbstractFactory23/*/4/时尚男装5/6publicclassFashionManClothes:AbstractClothes78publicoverrideAbstractFactory.AbstractCoatCreateCoat()910returnnewCoatA();111213publicoverrideAbstractTrousersCreateTrousers()1415returnnewTrousersA();16171819/*/20/时尚女装21/22publicclassFashionWomanClothes:AbstractClothes2324publicoverrideAbstractCoatCreateCoat()2526returnnewCoatB();27/thrownewException(Themethodoroperationisnotimplemented.);2829publicoverrideAbstractTrousersCreateTrousers()3031returnnewTrousersB();32/thrownewException(Themethodoroperationisnotimplemented.);333435具体产品角色:(注意:我并没有把所有的具体产品类都列出来,由于简单,可以推想出剩余的产品类,详见附件) 1namespaceAbstractFactory23/*/4/时尚男性上衣5/6publicclassCoatA:AbstractFactory.AbstractCoat78privateboolsex=true;9privatestringstyle=时尚;10/*/11/重写基类的Sex属性12/13publicoverrideboolSex1415get1617returnsex;18192021/*/22/重写基类的Style属性23/24publicoverridestringStyle2526get2728returnstyle;2930313233/*/34/时尚男性裤子35/36publicclassTrousersA:AbstractTrousers3738privateboolsex=true;39privatestringstyle=时尚;40publicoverrideboolSex4142get4344returnsex;454647publicoverridestringStyle4849get5051returnstyle;52535455客户端代码:1namespaceAbstractFactory23/*/4/创建衣服类5/6publicclassCreateClothes78privateAbstractCoatmyCoat;9privateAbstractTrousersmyTrousers;10publicCreateClothes(AbstractClothesclothes)1112myCoat=clothes.CreateCoat();13myTrousers=clothes.CreateTrousers();141516publicvoidShowMyClothes()1718Console.WriteLine(MyClothes:);19stringsex=myCoat.Sex?男:女;20/Console.WriteLine(Coat:01,myCoat.Sex?男:女,myCoat.Style);21Console.WriteLine(Coat:01,sex,myCoat.Style);22sex=myTrousers.Sex?男:女;23Console.WriteLine(Trousers:01,sex,myTrousers.Style);2425262728publicclassClient2930staticvoidMain(stringargs)3132/创建一个工厂类的实例33stringassemblyName=ConfigurationManager.AppSettingsassemblyName;34stringfullTypeName=string.Concat(ConfigurationManager.AppSettingsnameSpaceName,.,ConfigurationManager.AppSettingstypename);3536AbstractClothesfactory=(AbstractClothes)Assembly.Load(assemblyName).CreateInstance(fullTypeName);37CreateClothesclothes=newCreateClothes(factory);38clothes.ShowMyClothes();39Console.Read();40414243app.config文件12345678这样,代码就完成了。小结一下:抽象工厂模式堪称gof23种设计模式精典模式之一,它能够解决诸如:通过显示指定类创建对象,紧耦合,对对象表示或实现的依赖等等一些问题,有关设计模式的设计原则,所能解决的问题,详见OO与设计模式的原则、目标 。抽象工厂模式适用于对“一系列相互依赖的对象”的创建工作,这些对象是相互依赖的,是有联系的。如果仅为一个对象的创建则用简单工厂模式或工厂方法模式完全可以实现,没有必要用抽象工厂模式。由于抽象工厂模式的客户端只依赖于抽象工厂,抽象产品,在初始化过程中仅用到一次具体工厂我们又把它放在了app.config中了,完全依赖接口,这样不仅在系统的扩展性方面好,而且可以提高团队开发效率。两个团队只要彼此了解定义的接口,抽象类,可以并行开发。举个例子,就拿博客园来说吧,我们在用自己的博客空间时,可以随时的换皮肤,这个换皮肤是不是典型的抽象工厂模式吗?如果是,它的各个角色又是什么呢?我认为是的。换一下皮肤,你博客页面上的各个样式都变了,而且这里各个样式都同属于你选定的这一个皮肤。而每个样式都又是独立的,它们组合起来就成了一款皮肤。我们来揪出来各个角色。抽象工厂:皮肤抽象产品:样式具体工厂:某一款皮肤,皮肤名即为具体工厂的类名具体产品:某一个样式。虽然不存在这样的接口与类,但是它确实是抽象工厂模式的一个应用。抽象工厂制定都有哪些样式名,而具体工厂来实现这些样式名中的样式,而具体工厂中用到的各个样式都是一个具体产品。这也是我的理解,如兄弟们有不同的见解,欢迎发表意见,共同探讨。确定过各个角色之后,就可以说一下为什么提高效率了。不论dudu在设计博客园时用什么工具或语言,它与泸江博客只要约定好所有用到的样式名就可以了。而泸江博客就可以根据要求
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 口腔助力医师知识培训课件
- 口腔前台洗牙知识培训课件
- 2025年中国呋喃铵盐(SMIA)行业市场分析及投资价值评估前景预测报告
- 2025年中国风电叶片灌注树脂行业市场分析及投资价值评估前景预测报告
- 口腔养生保健小知识培训课件
- 浙教版八年级下册信息技术第2课走进Flash 教学设计
- 广东省廉江市实验学校高中政治 3.2 消费及其类型说课稿(必修1)
- 羊的繁殖与改良教学设计中职专业课-畜禽生产-畜牧类-农林牧渔大类
- 保姆知识培训心得体会
- 口罩知识培训
- DB32T-乡镇农产品质量安全监管机构建设规范编制说明
- 四川省挤塑聚苯板建筑保温工程技术规程
- 一例晚期直肠癌多发转移患者镇痛治疗病例分享
- 《工业互联网技术导论》 课件全套 第1-10章 智能制造与工业互联网-工业人工智能
- Ice-O-Matic CIM登峰系列制冰机培训手册
- 加油站应急情况处理技巧
- 高中英语完形填空高频词汇300个
- 2023-2025年世纪公园综合养护项目招标文件
- 男朋友男德守则100条
- 食品安全风险管控日管控检查清单
- 乡村振兴汇报模板
评论
0/150
提交评论