




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
模式:
模式,即Pattern。其实就是解决某一类问题的方法论。把解决某类问题的方法总结归纳到理论高度,那就是模式。Alexander给出的经典定义是:每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心。通过这种方式,你可以无数次地使用那些已有的解决方案,无需再重复相同的工作。模式有不同的领域,建筑领域有建筑模式,软件设计领域也有设计模式。当一个领域逐渐成熟的时候,自然会出现很多模式。设计模式和面向对象的设计模式:
设计模式(Designpattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。设计模式最初来源于建筑学。GOF(“四人帮”,指Gamma,Helm,Johnson&Vlissides,Addison-Wesley四人)的《设计模式》(1995年出版)是第一次将设计模式提升到理论高度,并将之规范化,本系列文章主要就是讲解这23种经典的设计模式。
面向对象设计的模式,顾名思义,就是在面向对象分析与设计中使用的设计模式,GOF23种设计模式同时也是面向对象的设计模式,本文不做区分。良好的设计模式运用可以实现软件设计的“高内聚、低耦合”,提高软件的复用性和可扩展性。框架:
框架,即Framework。其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统。简单说就是使用别人搭好的舞台,你来做表演。而且,框架一般是成熟的,不断升级的软件。框架一般处在低层应用平台(如J2EE)和高层业务逻辑之间的中间层。架构:
架构(Architecture)是一系列相关的抽象模式,用于指导大型软件系统各个方面的设计。架构是一个系统的草图。架构描述的对象是直接构成系统的抽象组件。各个组件之间的连接则明确和相对细致地描述组件之间的通讯。在实现阶段,这些抽象组件被细化为实际的组件,比如具体某个类或者对象。在面向对象领域中,组件之间的连接通常用接口来实现。
一些刚入门的程序员经常会混淆“框架”和“架构”这两个名词,这里做了一下解释。我们为什么要使用设计模式呢?有人可能会说为了设计出"高内聚低耦合"的软件。"高内聚低耦合"的软件实际上也就是本文所说的具有可维护性和可复用性的软件。这篇文章主要讲解两方面内容,这两方面是软件设计中很重要,也是很关键的内容,希望大家认真思考并深刻理解。第一部分就是关于软件的可维护性和可复用性的相关内容,第二部分就是在第一部分的基础上逐条讲解面向对象软件设计的基本原则,本文内容都是些很理论性的东西,这些理论是软件设计的基础。凡是有理论的地方,就有如何恰当的将理论应用到实践中去的问题,设计模式是对于学习OO设计原则的具体指导,也就是说设计模式就是将这些理论应用到实践的一种成熟的方式。软件的可维护性和可复用性叠爽诞
首搂先来屑上一浑段大信师所底说的竭话,鉴很经赤典。她“通杆常认终为,铜一个埋易于朵维护秀的系葡统,骨就是介复用北率较盾高的虎系统丽;而销一个董复用请率较略高的链系统蜜,就幼是一韵个易迟于维识护的哑系统除。但符是实熊际上巷,可港维护范性和沫可复虫用性伪是两胡个独狼立的叙目标波,就认像两傲只奔丧跑的遇兔子雾一样氧,并珍不总滴是方坦向一菊致的夜。对属于面历向对蜘象的炒软件途系统棵设计流来说想,在滴支持圾可维脂护性穗(M毙ai捡nt国ai浮na急bi挡li恳ty膜)的戏同时息,提菊高系狼统的进可复捞用性滨(R屋eu伙se束ab监il妄it睁y)恼是一支个核兴心的蹈问题遭。”速--湾《J受av湿a与机模式头》阎基宏博扎士镜荒京孙软件础系统籍的可咽维护候性:序还言
软常件维惑护就组是软搭件的衔再瑞生。阿一个谈好的愉软件锐设计壁,必沫须能悬够允艘许新扭的设任计要蓝求以包比较狱容易盗和平歉稳的气方式校加入伯到已贤有的乳系统鸦中去矛,从锈而使咸这个修系统营能够节不断榆的的骑焕发辩出活语力。接一个剧可维态护性泛较好拨的系站统,稀应当抓允许然维护脸工作婆能够斩以容凡易、废准确继、安蹄全和纱经济迈的形耐式进塔行。眨【导码致可冷维护杜性较买低的熄原因产】坑1、辉过于似僵硬缺:在桑系统膜中加丸入一馒个新姓的功龙能,筹不管着大小崭都很最难,蝴不仅泛意味茧着建束造一暗个独钳立的而新的嘴模块编,而臭且因妄为这后个新分功能薄会波红及很朱多其污他模倾块,伏最后罪成跨颤越几触个模狱块的绍改动处。丢2、寿过于匙脆弱轧:与叨软件减的过删于僵哄硬同匪时存果在,过是软促件系陡统在程修改胞已有踏代码贡时过掏于脆桑弱。仅对一期个地史方的孝修改桨,往盾往会件导致值看上广去没米有什帖么奉关系诚的另横外一逼个地培方发对生故们障。安3、洽复用层率低把:所蜜谓复臣用,讲就是愧指一烫个软妻件的豆组成肌部分末,可易以在巡同一膜个项念目的签不同富地方拆甚至暑另一彻个项倍目中比重复修使用怪。复副用率祖低,潜指当乔一段煤代码分,函捧数,王模块捐的功腹能可贿以在姑新的宵模块蜘或新宣的系始统使博用,棒但是烛已有狮代码晒依赖允于其幕他很肺多东写西,教很难麻分开喷。辽4、琴黏度降过高辟:一消个改哨动可为以保凑存原坐始设降计意朽图和筹原始捷设计请框架衫的方巧式进青行,牲也可赶以以捐破坏丝原始辟意图匹和框公架进漂行。回第一也种方寇法对况系统豆的未框来有五利,豪第二岸种办教法是覆权宜踪之计颗,可酸以解杆决短贷期的害问题杯,但遗是会善牺牲索中长宴期的债利益筑。如死果一健个系著统中唯使用扇第二休种方喇法比敢使用乳第一痛种方捏法容湿易,眉那么狗就是恩黏度劫过高踩。贩【讽设计到的目北标】壳1、坡可扩屿展性馆:新奸的性饼能可撒以很娱容易鸦地加误入到嘉系统剂中去卵,就蝶是可煮扩展替性。舞这就典是系楚统“跨过于覆僵硬柴”的刺属性狱的方顷面。齐2、海灵活疮性:焦可以炒允许居代码消修改俯平稳帐地发栏生,鲜而不叠会波开及到鹊很多蜜其他拿的模筛块,递这就怖是灵呢活性披。灵慌活性斯其实烤就是炕“过岛于脆捡弱”岸的属讨性的督方面排。每3、尺可插宿入性尺:可柄以很捉容易卸地将母一个靠类抽角出去悉,同辽时将麻另外诞一个兆有同如样接瘦口的块类加激入进想来,库这就晒是可振插入主性。两其实永,这白就是劲“黏姿度过采高”稳的方态面。考朴校鉴软件年系统蛇的可贱复用倚性:方【软可件复编用的辨好处悔】之1、岩较高笋的生辨产效夹率;捆2、劣较高旗的软照件质剪量;志3、雕恰当泉使用伏复用劣可以乐改善俭系统旦的可惊维护舒性。纪【朱传统鱼的复侧用形侄式】衰1、聋代码奏的剪迅贴复填用;怕2、畏算法劝的复诚用;笔3、游数据部结构交的复火用。毅【面你向对疲象设停计的合复用小】设在面语向对愁象语厦言中糖,数它据的惯抽象妹化,筐继承姓,封花装和赚多态钓性使着得一杏个系铜统可不以在坛更高西层次采上提盲供可冷复用冰性。则数据怜的抽遣象化沃和继柄承关系系使计得概消念和币定义逐可以浅复用勉;多温态性浅使得痕实现视和应损用得火到复精用;填而抽生象化商和封幼装可鼻以保污持和芝促进康系统消的可强维护国性,糖复用冷的重堂点转征移到快含有音宏观刻商业捧逻辑销的抽帜象层扇次上将。在僻面向币对象启的设稳计里鸣面,按可维理护性心复用钟是以岭设计球原则壁和设怒计模赵式为旗基础状的。墙格晨
提风高系源统可恳维护柱性和柴可复讽用性奉的设股计原暗则余1、途“开塑-闭决”原眯则(登Op县en声-C筝l冤os气ed喜P晃ri菊nc晚ip麦le挡,或恳者O浑CP捉);现一个寒软件络实体针应该艰对扩刃展开集放,瓣对修差改关四闭狼;裁在设梳计一降个模毁块的许时候帽,应是当使肯这个纱模块饰可以惊在不涛被修锅改的蜻前提雄下被缸扩展停。换地言之起,应处当可晴以在是不必僵修改院源代教码的威情况蝶下改啊变这挑个模麻块的小行为眉。裹这个烧原则归实际牺上是百对“颗对可别变性覆的封脸闭原确则“壤:找口到一都个系肌统的椅可变者因素剪,将恨之封思装起扮来申。这吹个原鸦则意魂昧着努两点绕:锋1)拴一最个可如变性邪不应附当散放落在拦代码舒的很辱多角里落里洒,而友应当好被封矿装到酒一个软对象佣里面拘。同岔一种加可变秒性的福不同宿表象赔意昧株着同毛一个浅继承路等级窑结构来中的拥具体尘子类仰。托继承较就当旅被看占作是欠封装押变化言的方据法,朗而不掘应当平被认祖为是圾从一度般的息对象蝴生成大特殊晚对象名的方某法盘。膀2)升一持种可言变性守不应舰当与通另一亡种可贱变性床混合担在一旧起。年(所袋有类摩图的特继承贤结构潜一般修不会悠超过游两层居,不骡然就论意昧甲着将搁两种案不同申的可腰变性来混合度在了凉一起投。)差这个斤原则王是总贴的原顶则,帜其它死几条甩是这淘个原坏则的炸手段坦和工焦具。葱2、默里氏爽替代余原则共(L践is岔ko竹v压Su乎bs弦ti秩tu蛛ti这on窗P伟ri御nc畜ip好le芒,或建者L脂SP攀);皂如果节对于台每一昌个类桌型为合T1吩的对报象o扯1,爬都有缓类型飞为T鲁2的散对象新o2掘,使勾得以进T1万定义士的所者有程紧序P够在所毛有的镜对象债o1照都代植换成培o2末时,斧程序裤P的畅行为棚没有软变化猎,那自么类罚型T绒2是涉类型变T1赠的子摘类型化。啄换言浊之,咸一个骗软件才实体警如果述使用稻的捉是一渡个基趴类的终话,肯那么料一定备适用海于其武子类驴,而粒且它霸根本田不能忽察觉厕出基奶类对约象和裁子类沈对象章的区疼别。茎反过悔来代嗽换不倡成立叉。补3、废依赖继倒转菜原则求(D离ep蜘en吨de音nc蒜y捎In漠ve扑rs议io习n兽Pr肤in昼ci捡pl隔e,春或者符DI近P)排;储要依彼赖于玉抽象掀,不稀要依涝赖于果具体揭。愁开闭抽原则扮是目池标,灿而达滔到这校一目慕标的膀手段亚是依燕赖倒糕转原涂则。问抽象寄层次瞎包含肥的是欢应用哨系统价的商丘务逻港辑和凡宏观裂的、穿对整列个系映统来突说重昂要的挠战略顾性决缩定,沈是必瓦然性阁的体较现,域那么恼抽象贴层次神就应赞当是瓜较为串稳定胞的,伸应当毅是复枕用的劳重点浑;也推应当完是维修护的达重点维;而炕具体湿层次泥则含旧有一要些次律要的鞋与实着现有构关的苗算法破和逻猫辑,鸭以及遭战术治性怀的决疼定,继带有辅相当率大的赚偶然适性选袖择。建具体碰层次寸的代站码是屈会经弃常有检变动裁的,汗不能娘避免微出现槽错误精。竖4、弦接口戏隔离祸原则蹲(I拦nt缓er誉fa论ce显S季eg驳re筋ga底ti裳on刃P炒ri维nc园ip田le由,或竖者I皱SP耽);故使用卧多个裕专门欲的接刚口比闲使用骡单一答的总大接口定要好修。的换言姑之,隆从一胸个客恰户类即的角泳度讲掘:一悠个类施对另尽一个饰类的健依赖式性应丙当是落建立加在最典小的独接口冒上的润。御接口题隔离援原则忘与迪蜻米特泄法则良(下渠面讲客到)诚都是仓对一辟个软萍件实输体与喉其他险的软护件实假体的肆通信采限制租。迪港米特鄙原则萄要求稳尽可冒能地拼限制占通信境的宽央度和乐深度租,接缴品隔洗离原芒则要汪求通廉信的忌宽度业尽可幅能地由窄。推这样址做的扰结果矩使一饰个软敏件系焦统在模功能额扩展融过恳程当揭中,鹿不会柱将修播改的步压力袖传递格到其露他对戒象。练一个观接口蚕相当药于剧烈本中陶的一华种角旧色,员而此项角色革在一侮个舞僵台上便由哪茎一个同演员械来演脑则相探当于丸接口遭的实磁现。旁因此孩,一片个接椅口应兆当简举单地验代表耗一个业角色窜,而秀不是咬多个刺角色叶。如昆果系横统涉盛及到术多个命角色丧的话跌,那轻么每助一个佳角色慨都应认当由躲一个逝特定乓的接惯口代舞表。鸭5、青组合病/聚狐合复随用原疤则(屡Co淡mp戒os秃it世io受n/和Ag建gr蜂eg脾at萝io苦n计Pr催in斩ci煎pl逐e,陪或者兄CA耕RP削);社组合况/聚内合原菠则就锁是在横一个校新的枯对象易里面防使用养一些忧已有辉的对涨象,委使之笑成为隐新对企象的嫌一部铃分;鞠新的吩对象市通过踩向这哭些对挥象的挖委派卸达到城得复鞠用已校有功字能的竿目的欣。辽要尽辜量使颗用嘴组合周/聚采合,野尽量渠不要碍使用备继承劈。爹6、肿迪米扇特法纪则(校La凳w骡of天D逢em逗et秧er丽,或续者L嘱oD竹);净一个归软件易实体好应当江尽可贫能少虏的与茎其他亡实体予发生抓相互枪作用轮。模梦块之放间的斤交互泽要少脉。这督样做排的结糕果是村当系文统的承功能仆需要贡扩展之时,瞒会相禽对更弊容易静地做站到对便修改慎的关擦闭。捏一个丰对象深应当大对其苗他对军象有鉴尽可应能少界的了贴解。渴7、嘴单一扒职责富原则友(S胸in蚊gl缸e嫁Re嫂sp屈on伏si姨bi忧li芬ty卖P帐ri梳nc移ip伶le僵,或雄者S莲RP伪)坦在设裹计中必为每缘种职尸责设播计一矩个类谈,彼仪此保季持正志交,骂互不火干涉堪。这拨个原撞则比享较容圈易理坑解,症这里唇不在级多说重。裕间无
小摇结谢冷繁
当销我们月掌握悠了C推#的景语哪法,摸当我征们了论解了仅面向寿对象河的封抓装、窝继承黄、多上态等血特性演,当债我们歌可以女用各盛种框级架与牛技术述构建丢桌面毫以及颤We性b应矮用时惠,这民并不个意味舱着我链们可讽以写地出面若向对盲象的食程序逮,不阳意味先着我厘们可名以很息好的吵实现潮代码鸣复用阔,弹惹性维岔护,题不意怀味着秧我们乘可以旱实现谢在维义护、阵扩展臂基础铅上的捡代码欧复用剑。舍使用车面向牵对象鹅语言丹开发滑的程蜜序不戒一定捎是面麦向对胶象的纹,垫使用锡面向肾过程齿的语斜言开唤发的赢程序劳也不牢一定适不是长面向们对象笑的。助要想镇开发狂出一钻个具帅有可躺维护痛性和牵可复缠用性计的软赞件系眠统,菊那是德需要焦优秀口的设给计和挖长时其间的睁运行花才能炭完成赌的,沙其实铸我们甘可以埋观察炕一下稀,任怪何一珍个优口秀的打软件追产品弓都是消经过增长时喜间的刃设计浑,运枝行,恰维护鲜,修授改等疼最后乔才成敞为成壮功的饱产品仆,版晚本上貌也在凶不断伟的更丝新。体衡量租一个坟软件质开发句者是俘不是仿一个丈好的愉软件粘开发笑者,谜不是罚看他至是否坛实现仓了软妥件的货必要佩功能蒙,而态是要添看你宗的软食件在问满足似功能右需求蚕的情傲况下针是否冰做到臭了复循用性繁和可乔扩展榆性,耀这对气于一京个大境型系异统尤稠其重陵要。饥我们虫不要述静止蝴的看串待一靠个软蒜件,黎而一它定要调把软邀件过写程放怜在时畏间轴赤上来宜观察矩与设怖计它固,只微有放狱在时富间轴续上经令得住拴考验周的软创件系群统才严是成哗功的反。软愧件的荒复用乓性和腾可扩船展性晒对于浸大型贱系统稳是必悬要的堪,我女们在乳设计蔑自己驶的软袄件系中统时滚,甚谷至在跳编写踩代码日时更松需要粪考虑覆一下雾这样漆做是秘否遵康循了签系统绞设计领的原圾则,勾是否解有利恰于系靠统的狮可维式护性授和可制复用和性,饱是否劫达到雨了常湖说的胶“高比内聚丑低耦扫合”认呢?战设计瞎模式峰正是匆解决馅这一翼问题纠的王单道。德追刑
从似下文栏开始遥我们愧将结次合实荣例对估于G达oF灶23丛种设两计模图式进学行一酱一讲咬解。端现在男我们革正式凝进入内Go舌F2植3种逮设计星模式胞中的亲创建弄型模郊式的粒讲解沉中来窑,创践建型父模式设主要捆解决妻对象陷如何许创建先的问蠢题,袖提倡灶创建大对象被的责御任和敲使用猎对象琴的责网任分起离,县以达烘到更急好对推创建亦对象玩的控厦制的搂目的迎,创桂建型赢模式满主要断包括帅抽象拢工厂猴(A沉bs间tr坚ac辆t叙Fa牲ct外or香y)偷,建直造者乐(B客ui吵ld椅er汇),孙工厂识方法响(F知ac可to息ry茅M趴et策ho月d)次,原掉型(别Pr选ot肺ot倚yp饥e)抚,单世子(移Si温ng稻le某to六n)牺。偶这篇达文章飞主要浮分为亚两大游部分醉内容踪,在滑第一咽部分判中我固将介刘绍抽总象工新厂模下式的纠原型她,包回括抽绑象工闪厂的集意图胳,可族以解螺决的扭问题径,原戏型代粒码和滴UM桑L等荷,再窝结合袄一个眠生活度中的杰小例殊子进之行原防型的望说明棉。第古二部考分我巩会结峰合实势际项唇目来龟讲述标一下搁抽象脊工厂友模式新是如伟何应坦用的浮。最国后我吵会对师抽象冈工厂菜模式清进行谨一个哭小结油。布递丈
工明厂模院式的胃几种退形态仔折向判工厂抄模式半专门赏负责掘将大效量有句共同景接口望的类凳实例睁化。马工厂胳模式过可以抖动态撇决定态将哪届一个远类实盈例化谎,不羡必事瞒先知韵道每笨次要疾实例擦化哪粗一个城类。务工厂由模式始有以糠下几村种形柄态:肢简单怕工厂棕(S匠im森pl蜡e瞎Fa铜ct惭or斥y)太模式索:佩又称姐静态厦工厂孙方法勿模式鸦(S疲ta脱ti卸c捡Fa走ct和or制y展Me早th基od旗P芹at荷te纤rn骄)。姥主要绸是工枣厂中挖提供鲁一个郊静态弱的方之法用汪来根知据不足同的绝参数踪创建帜不同帜的抽而象产密品的初具体冲实寸例,皱一般递在I屿oC谜中应村用比靠较多衣,例顿如通慰过反籍射机矛制和丧简单翅工厂扁模式着可以悲解决嗽依赖横注入奋的问畜题。部简单咏工厂划模式鸽不属劈于G哨oF幸23肆种设盖计模悦式,瘦这里奔也就磁不再晴作过穴多的灾分析姻。感身兴趣郊的园爷友可化以找责找相侨关资孟料。辱工厂讯方法臭(F务ac榨to乌ry蓬M洽et咐ho摸d)愈模式冤:模又称踪多态予性工滑厂(耀Po堆ly远mo雨rp欣hi燃c鉴Fa寒ct流or饱y)守模式蜓或虚桥拟构杠造子躲(V坑ir麻tu志al虹C钟on冰st融ru刘ct枝or姥)模吹式。期这个膀模式瓦属于汽Go喇F2悲3种比设计农模式夏之萄一,均在后指面的焦文章扔中会致做详遗细的右介绍乐。赛抽象勿工厂鉴(A内bs苗tr末ac劲t疤Fa陕ct枣or赞y)竿模式场:技又称睬工具掌箱(巴Ki设t或狸To炕ol哭ki杆t)铁模式咐。赌这是嚷本文圈的重较点。椅忽维
抽抓象工娇厂模昨式的成原型花准罪坛描述脏:似椒锄
假凡设一功个子捆系统伪需要保一些停产品稿对象桥,而遥这些恨产品调对象吸又属奶于一扁个以壁上的竿产品者等级目结构熔。那细么为方了将扰消费究这些胀产品妙的责盯任和衰创建不这些最产品向对象致的责发任分或割开笔来,慕可以获引进付抽象卷工厂社模式赠。这北样的鼻话,面消费快产品垒的一钥方不趋需要袖直接兼参与泛产品古的创掉建工这作,巩而只录需要舞向一烘个公容用的素工厂晴接口梯请求牛所需贸要的果产品普。巨俯秒谨意图叨:爹丹裁
抽畅象工片厂模森式可台以姻向客冶户端胸(C匹li偶en原t指陆代码资模式览的使磨用者由,后弃文类排同)规提供患一个症接口宫,使贷得客熟户端核在不蚀必指岩定产才品的房具体翻类型搜的情烘况下足,创戏建多把个产筛品族贞(P淋ro蔽du打ct扶F迎am认il挤y指军位于俊不同秆产品监等级殊中,甲功能攻相关毛联的阅产品盟的集别合)嚷中的肌产品问对象送。搬束唇案模式志原型希UM壤L:聪把榜挥笨鼻
抽令象工啊厂涉笑及到月以下刃角色樱:警安明
抽脑象工缩厂(限Ab疑st甲ra程ct遮Fa吧ct芒or甜y便)角东色:奔声明遭一个扔操作的集合凯的接嫩口以揭创建稼抽象扒产品删族。披链庭
具客体工跑厂(好Co所nc盲re外te惯Fa倾ct嫩or咱y)怨角色亏:实演现创量建具挪体产弃品族基的抽盈象工期厂的亲实现挤。疾炒傅
抽始象产诚品(欠Ab渔st短ra尿ct召Pr查od姓uc雹t跨)角但色:走声明慢一个掀产品缸的接女口。帝懒拍
具愁体产销品(棋Pr蹦od饼uc喜t)知角色肿:定棚义了杨一个肥被具询体工巴厂创宝建的拐产品田对象索,实博现了毕抽象锻工厂赌接口郊。锅停厦
客躺户端勾(C计li熊en绘t)祸角色滑:使丑用抽威象工杜厂和惜抽象俘产品脊的类饺。徐哲摸继模抽式原倦型代闷码:usingSystem;namespaceDesignPatterns.Creational{羡荡维//号测牌试程口序花特尽cl饱as红s交Ma番in伍Ap三p呀木芦{附蹦泡清箭pu畏bl昆ic苗s胖ta在ti侍c躬vo打id西M蒙ai敬n(柿)骑临织嫁距{纷包叉缴减阔有//歉抽拴象工防厂1减冬牧死闯沉走杜Ab饺st鸽ra梨ct恒Fa患ct走or的y歉fa千ct瞎or令y1拴=挑n蛋ew拨C陵on臣cr破et比eF冰ac跃to督ry户1(志);恳电慌挡功零廊Cl姥ie驰nt蔽c安1束=所ne挠w萄C匀li伤en城t(爽fa守ct伐or发y1这);赶室奏口歌裤该c1团.R眯un靠()用;凝单役恒的啄早//针抽绑象工欲厂2拨雹议达勉歇虑鼓Ab捡st已ra拣ct递Fa炭ct汇or糕y挑fa换ct蜂or锋y2斑=效n迹ew宁C缸on挨cr戏et稳eF隆ac评to岛ry纪2(界);款替陷施罪框喇Cl涛ie灯nt惠c志2击=桥ne勇w唉Cl许ie诉nt剧(f燃ac到to馆ry抱2)矩;士狗辫偶妨姜植c2唐.R跌un叮()粱;形丘补亩台怠芳//恼等付候用臣户输疫入贷虹诊胜带宣旗Co石ns汽ol所e.融Re搏ad潮()蛛;耀毕艺安卵}榴淋绝}书摆奶//剖抽慌象工钳厂忆准奶ab词st奔ra劈ct农c鞠la幕ss茂A笨bs认tr盈ac宫tF旅ac艘to幻ry她漆圣{斜租赖酒肿pu冒bl矩ic著a厚bs乒tr愉ac后t监Ab适st透ra疑ct态Pr贝od斗uc辟tA蔑C您re寄at遥eP遍ro家du兔ct李A(别);叛夕樱锐春pu务bl谈ic盏a查bs直tr盲ac路t训Ab悬st租ra坑ct勇Pr敏od撞uc欺tB数C矩re龙at肉eP液ro陡du腊ct忘B(驶);记偷愚}牧喊兆//博具办体工船厂1青垮兔cl蛮as游s永Co弄nc消re殃te客Fa冈ct拆or樱y1径:皂A蚊bs勿tr梦ac辜tF夕ac浇to惕ry恨允京{证挺贼烂pu哲bl员ic兼o窃ve胖rr册id坏e质Ab撕st灯ra携ct伪Pr况od张uc罗tA矿C装re炕at仰eP思ro煤du供ct衫A(宜)唤村治酒提{裁井膝委疑提障re征tu吗rn味n穿ew淹P俭ro肃du奴ct收A1透()斑;仿许善舟责}沿篮要码伟pu五bl萄ic概o唐ve瞎rr跟id知e译Ab六st葡ra仍ct耐Pr姻od危uc翻tB偿C盐re枯at典eP笨ro哲du挡ct初B(匆)六钻拳划押{飞屿餐李歪费师re龙tu边rn如n鹊ew列P据ro唐du墙ct献B1攻()跑;映妨浆限共}经壶倾}热渴漫//谎具迁体工鹿厂2待霜营cl著as塞s掩C旺on兼cr层et尚eF嚷ac框to敞ry灾2讽:马Ab过st贝ra锋ct绵Fa金ct旅or妙y圈愧蛾{蔑筝阶政姐pu奶bl植ic浙o艰ve错rr宽id什e塑Ab扎st骆ra搞ct蕉Pr慢od轨uc膝tA驴C香re驼at斯eP系ro钓du碰ct漂A(肿)辣碑旺猪喂{野模盾员证灰说re穴tu惠rn拿n暑ew法P卷ro娘du辅ct超A2挨()朵;巧捞理健凑}虚萝假串苦pu屠bl攻ic盆o南ve挤rr灵id聋e位Ab徐st首ra辽ct级Pr测od蹦uc发tB似C胃re颜at禾eP对ro妥du劣ct回B(侄)短壮饥法交{朽惹法卧申犯溪re辉tu龟rn例n看ew雅P懂ro嘉du象ct袄B2歇()渠;落太嘉普背}亚翅波}鼓母层//彩抽奥象产雁品A矩,产村品族济中一秃个成烫员且亩援ab尘st占ra努ct贯c坝la悬ss理A嚷bs谷tr陶ac洽tP瓣ro愈du数ct泽A请止幻{询固输}仅雾挨//锋抽野象产便品B烧,产静品族耀中一孝个成注员盖谅蝇ab抵st种ra泉ct安c个la喜ss鸽A任bs企tr陈ac爹tP复ro蹈du锣ct挑B岗跳钩{也赴打闸蛛pu歉bl泄ic移a荐bs衔tr始ac裕t愉vo臭id念I锯nt良er议ac汪t(演Ab缝st货ra纺ct讯Pr肝od欣uc渠tA辽a技);冬狸孟}劝吵岸//为具锄体产借品A哨1厨权遭cl团as见s肝Pr持od捷uc侍tA钱1阴:糖A北bs绣tr漂ac竟tP爬ro段du睡ct女A单斜染{留柴婚}戚弃姿//警具翼体产叮品B岛1灯躺路cl羞as谜s锐Pr燃od泛uc朝tB背1益:谦Ab检st狐ra圾ct矿Pr堤od昆uc父tB傻腹厨{惊小统滚屡pu吧bl领ic砖o割ve钉rr仍id难e鸦vo喘id辛I剑nt康er室ac绩t(缠Ab字st星ra室ct异Pr保od唉uc蕉tA千a壁)湿旷扫横消{款伍刚看到剪异Co慰ns凳ol宇e.片Wr寻it爆eL布in齿e(寇th守is完.G广et窗Ty垮pe哀()自.N犁am备e迅+镰蜻织椅挡只督厘"照in逢te体ra赚ct港s搂wi惕th胳"覆+野a撇.G腰et遗Ty翠p疑e(宗).借Na掘me进);循对资雅泻}怜妄弯}撑晓旗//新具樱体产兄品A量2卫弃合cl锁as雕s坑Pr宰od架uc休tA瞎2扩:锁Ab的st胞ra雾ct切Pr偿od枪uc冈tA瞎体触{蔽限猫}稍颤怕//汗具帆体产宴品B中2桶冲草cl蛙as某s柜Pr木od县uc散tB侧2测:悬Ab溉st吐ra镰ct狭Pr鸣od惠uc叼tB架霞棋{薪背电值师pu下bl耐ic项o鲜ve菌rr宵id黎e槽vo和id刃I克nt储er赔ac酱t(开Ab商st苏ra鸣ct耀Pr反od睬uc答tA栏a搏)对窜顶爆烘{祝览车坐迈酿近Co饶ns罢ol痰e.虚Wr锡it也eL锋in慰e(扯th滚i算s.蛾Ge激tT线yp庭e(漂).奶Na筹me弃+蜡猎震洽格帖遍潜"庆in繁te拾ra售ct猎s搜wi下th会"惜+灵a讯.G膊et舌Ty族pe字()锄.N涛am陕e)教;慌借鸽柳冒}繁雹萌}含掩尚//讽客程户端稍,使杂用环祖境延王除cl虎as绞s惩Cl乏ie助nt底根愚{则秧蠢衰像pr葛iv负at消e毕Ab斜st吸ra耍ct角Pr号od林uc脾tA抄A覆bs梅tr检ac帽tP妨ro齿du守ct赵A;恰红蓝矩随pr挪iv钱at慢e佣Ab橡st艺ra他ct塑Pr欧od傻uc食tB秩A虾bs塑tr轮ac厚tP白ro架du录ct纵B;铸菜下迷页//汇构病造,白注意浇通过杨构造袜传入描抽返象工倒厂俯顺貌败病pu敢bl而ic乡C推li爽en壳t(漆Ab泳st糟ra这ct蹄Fa搂ct雹or恨y屠fa依ct甘or汉y)零航辱棒花{榜匹索猎陡像毁Ab胸st型ra赖ct陕Pr稼od扒uc决tB绩=必f夜ac绩to营ry询.C拣re甚at皂eP财ro泥du集ct盆B(食);亚制劳示做妈妈Ab拾st锈ra倒ct票Pr头od注uc晒tA刷=牛f执ac蔬to都ry矮.C换re杜at束eP搬ro浴du俭ct姓A(幼);冒享斩听蹦}初严献粱垦pu摧bl站ic未v板oi画d脑Ru笋n(斩)酸淡盏望烤{婚扒俭幅国苍厌Ab积st胸ra裙ct役Pr葵od吃uc听tB环.I荒nt择er欧ac翼t(欺Ab揪st唱ra站ct采Pr往od哥uc厚tA穗);坐机免贪乱}突紧耕}挑}输出结果为:ProductB1interactswithProductA1ProductB2interactswithProductA2生活中的实例:这个生活中的实例代码演示了一个电脑游戏,在游戏中建立不同的动物世界会使用不同的工厂。虽然创建动物的大陆工厂是不同的,但是动物之间的相互关系保持不变。RealworldcodeusingAbstractFactoryinC#usingSystem;{classMainApp{publicstaticvoidMain(){//创建非洲大陆ContinentFactoryafrica=newAfricaFactory();AnimalWorldworld=newAnimalWorld(africa);world.RunFoodChain();//创建美洲大陆ContinentFactoryamerica=newAmericaFactory();world=newAnimalWorld(america);world.RunFoodChain();//等待用户输入Console.ReadKey();}}//抽象工厂abstractclassContinentFactory{//创建食草动物publicabstractHerbivoreCreateHerbivore();//创建食肉动物publicabstractCarnivoreCreateCarnivore();}//具体工厂1classAfricaFactory:ContinentFactory{publicoverrideHerbivoreCreateHerbivore(){//返回牛羚returnnewWildebeest();}publicoverrideCarnivoreCreateCarnivore(){//返回狮子returnnewLion();}}//具体工厂2classAmericaFactory:ContinentFactory{publicoverrideHerbivoreCreateHerbivore(){//返回野牛returnnewBison();}publicoverrideCarnivoreCreateCarnivore(){//返回狼returnnewWolf();}}//抽象产品AabstractclassHerbivore{}//抽象产品BabstractclassCarnivore{//交互关系,食肉动物可以吃掉食草动物publicabstractvoidEat(Herbivoreh);}//具体产品A1classWildebeest:Herbivore{}//具体产品B1classLion:Carnivore{publicoverridevoidEat(Herbivoreh){//吃掉牛羚Console.WriteLine(this.GetType().Name+"eats"+h.GetType().Name);}}//具体产品A2classBison:Herbivore{}//具体产品B2classWolf:Carnivore{publicoverridevoidEat(Herbivoreh){//吃掉野牛Console.WriteLine(this.GetType().Name+"eats"+h.GetType().Name);}}//客户端classAnimalWorld{privateHerbivore_herbivore;privateCarnivore_carnivore;//通过构造器传入具体工厂publicAnimalWorld(ContinentFactoryfactory){_carnivore=factory.CreateCarnivore();_herbivore=factory.CreateHerbivore();}publicvoidRunFoodChain(){_carnivore.Eat(_herbivore);}}}RealworldcodeusingAbstractFactoryinC#输出的结果为:LioneatsWildebeestWolfeatsBison
什么情况下使用抽象工厂:文献【GOF95】指出,在以下情况下应当考虑使用抽象工厂模式:1.一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有形态的工厂模式都是重要的。2、这个系统的产品有多于一个产品族,而系统只消费其中某一个族的产品(上面这一条叫做抽象工厂模式的原始用意。)3、同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。4、系统提供一个产品类的库,所有的产品以同样的接口实现,从而使客户端不依赖于实现。实际项目举例
现在需要创建分属于不同操作系统的视窗构件。比如命令按钮(Button)与文本框(Text)等都是视窗构件,在UNIX系统的视窗环境和Windows操作系统的视窗环境中,这两个构件有不同的本地体现,它们的细节也有所不同。在每一个操作系统中,都有一个视窗构件组成构件家族。在这里就是Button和Text组成的产品族。而每一个视窗构件都构成自己的等级结构,由一个抽象角色给出抽象的功能描述,而由具体子类给出不同操作系统的具体实现,如下图所示。
可以发现在上面的产品类图中,有两个产品的等级结构,分别是Button等级结构和Text等级结构、同时有两个产品族,也就是UNIX产品族和Windows产品族。UNIX产品族由UnixButton和UnixText产品组成;而Windows产品族由WinButton和WinText产品构成。
系统对产品对象的创建需求由一个工厂的等级结构满足,其中有两个具体工厂角色,即UnixFactory和WinFactory。UnixFactory对象负责创建Unix产品族中的产品,而WinFactory对象负责创建Windows产品族中的产品。这就是抽象工厂模式的应用,抽象工厂模式的解决方案如下图所示。
显然,一个系统只能够在某一个操作系统的视窗环境下运行,而不能够同时在不同的操作系统上运行。所以,系统实际上只能消费属于同一个产品族的产品。这个案例实际上也正是抽象工厂模式的起源。实现的代码如下。ProjectcodeusingAbstractFactoryinC#
输出结果为:ProjectcodeusingAbstractFactoryinC#//抽象工厂起源案例usingSystem;{classMainApp{publicstaticvoidMain(){//创建Unix使用环境OSFactoryunix=newUnixFactory();Clientclient=newClient(unix);client.Run();//创建Windows使用环境OSFactorywindows=newWinFactory();client=newClient(windows);client.Run();//等待用户输入Console.ReadKey();}}//抽象工厂abstractclassOSFactory{//创建按钮构件publicabstractButtonCreateButton();//创建文本框构件publicabstractTextCreateText();}//具体工厂1classUnixFactory:OSFactory{publicoverrideButtonCreateButton(){//返回Unix下的ButtonreturnnewUnixButton();}publicoverrideTextCreateText(){//返回Unix下的TextreturnnewUnixText();}}//具体工厂2classWinFactory:OSFactory{publicoverrideButtonCreateButton(){//返回Windows下的ButtonreturnnewWinButton();}publicoverrideTextCreateText(){//返回Winodws下的TextreturnnewWinText();}}//抽象产品AabstractclassButton{}//抽象产品BabstractclassText{//交互关系publicabstractvoidInteract(Buttonb);}//具体产品A1classUnixButton:Button{}//具体产品B1classUnixText:Text{publicoverridevoidInteract(Buttonb){Console.WriteLine(this.GetType().Name+"interactwith"+b.GetType().Name);}}//具体产品A2classWinButton:Button{}//具体产品B2classWinText:Text{publicoverridevoidInteract(Buttonb){Console.WriteLine(this.GetType().Name+"interactwith"+b.GetType().Name);}}//客户端classClient{privateButton_button;privateText_text;//通过构造器传入具体工厂publicClient(OSFactoryfactory){_button=factory.CreateButton();_text=factory.CreateText();}publicvoidRun(){_text.Interact(_button);}}}UnixTextinteractwithUnixButtonWinTextinteractwithWinButton
小结
抽象工厂模式是一个在实际项目中应用比较多的设计模式之一,抽象工厂模式面对的问题是多个产品等级结构的系统设计,运用抽象工厂模式的关键在于如果把创建产品的职责交给工厂去完成,希望大家在把握住工厂模式原型的基础上尽量的考虑到应用,形成一种思维上的定势。这一篇我将向大家讲解建造者(Builder)模式。在上一篇文章中我们主要学习了抽象工厂(AbstractFactory)模式,抽象工厂模式主要解决对不同等级结构的产品的创建工作,主要关注的是创建哪一批产品的问题,而本文所讲的建造者模式主要是解决对于一个产品如何分部创建的问题,这是对于建造者模式的最初描述。同样,这篇文章主要分为两大部分来讲解,第一部分我会对建造者模式的原型进行详细的说明,第二部分会对建造者模式如何解决具体问题进行探讨。
建造者模式的原型描述:
在软件系统中,有时候面临一个"复杂对象"的创建工作,其通常由各个部分的子对象用一定算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合到一起的算法却相对稳定。
建造者模式是对对象的创建模式。建造者模式可以将一个产品的内部表象与产品的生成过程分隔开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。建造者模式利用一个导演者对象和具体建造者对象一个一个地建造出所有的零件,从而建造出完整的产品对象。建造者模式将产品的结构和产品的零件建造过程对客户端隐藏起来,把对建造过程进行指挥的责任和具体建造零件的责任分隔开来,达到责任划分和封装的目的。
意图:
将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
模式原型UML:
建造者模式涉及到以下角色:
1、抽象建造者(Builder)角色:给出一个抽象接口,以规范产品对象的各个组成成分的建造。此接口中一般至少规定两个方法,一个是创建部分的方法,例如BuilderPart,另一个是返回结果的方法,例如GetProduct,以约束具体建造者实现。
2、具体建造者(ConcreteBuilder)角色:担任这个角色的是与应用程序紧密相关的一些类,它们在应用程序的调用下创建产品的实例。这个角色产品实现了抽象建造者接口,主要完成分部创建产品并提供产品对象的实例。
3、导演者(Director)角色:顾名思义,就
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高中法制教育主题班会
- 高校辅导员心理培训
- 深入解读2024CFA考试试题及答案
- 特许金融分析师2024年应试计划试题及答案
- 2024年特许金融分析师考试刷新知识与试题及答案
- 第一章 专题强化练3 碰撞模型及拓展应用-2025版高二物理选择性必修一
- 第七章 作业20 天体运动的分析与计算 万有引力和重力的关系-2025版高一物理必修二
- 社会责任对企业价值的影响试题及答案
- 辽宁省名校联盟2024-2025学年下学期高一3月份联合考试地理试题
- 湖北省襄阳市第四中学2024-2025学年高一下学期2月月考地理试题(解析版)
- 数学-广东省广州市2025届高三一模试题和解析
- 2025-2030中国供热行业发展前景及发展策略与投资风险研究报告
- 2025年北京电子科技职业学院高职单招数学历年(2016-2024)频考点试题含答案解析
- 招标代理机构遴选投标方案(技术标)
- MOOC 创业基础-暨南大学 中国大学慕课答案
- 精装土建移交管理办法
- 施工现场总平面布置图(共23页)
- 2-6个案转介表
- 小学生课堂常规(课堂PPT)
- 石灰石-石膏湿法脱硫技术
- 大门工程施工组织设计
评论
0/150
提交评论