工厂模式与OO设计的几个原则_第1页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、工厂模式与oo设计的几个原则摘自 ( 容易工厂模式(simple factory)和工厂办法模式(factory method) 在oo设计领域涉及到的几个原则: ocp(开闭原则,open-clos priiple):一个软件的实体应该对扩绽开放,对修改关闭。我的理解是,对于一个已有的软件,假如需要扩展,应该在不需修改已有代码的基础上举行。dip(依靠倒转原则,dependence inversion principle):要针对接口编程,不要针对实现编程。我的理解是,对于不同层次的编程,高层次裸露给低层次的应该只是接口,而不是它的详细类。lod(迪米特法则,law of demeter):

2、只与你挺直的伴侣通信,而避开和生疏人通信。尽人皆知类(或模块)之间的通信越少,耦合度就越低,从而更有利于我们对软件的宏观管理。 容易工厂模式及实例容易工厂模式又叫静态工厂模式,顾名思义,它是用来实例化目标类的静态类。下面我主要通过一个容易的实例解释容易工厂及其优点。比如有个国家的运动员协会,他们是负责记下与注册职业运动员的(就好似我们国家的体育总局,呵呵,无论足球篮球还是乒乓球的运动员都必需在这里注册才干拿到我们国家职业运动员牌照)。一家体育俱乐部(比如篮球的广东宏远,足球的深圳健力宝)想获得球员为自己俱乐部效力,就必需通过这个运动员协会。按照dip我们可以设计一个“运动员”接口,“足球运动员

3、”和“篮球运动员”(还有其他运动员)都实现“运动员”这个接口。而“运动员协会”就是一个容易工厂类,它负责实例化“运动员”。我们这里的“俱乐部”就是一个客户端(client),不同的“俱乐部”就是不同的客户端。详细如下图表示: 对于不同的俱乐部对象(无论是八一还是深圳健力宝),他们都是面对“运动员”接口编程,而不用管是“足球运动员”还是“篮球运动员”,也就是说实现了“运动员”接口的详细类“足球运动员”无需裸露给客户端。这也满足了dip。但详细的俱乐部(比如足球的深圳健力宝)如何确保自己猎取的是自己想要的运动员(健力宝俱乐部需要的固然是足球运动员)呢?这就需要“运动员协会”这一工厂类了。俱乐部通过

4、调用“运动员协会”的详细办法,返回不同的实例。这同时也满足了lod,也就是“深圳健力宝足球俱乐部”对象不挺直与“足球运动员:李毅”对象通信,而是通过他们共同的“伴侣”“国家体育总局”通信。 下面给出各个类的程序,会有助于读者更好的了解笔者之前的介绍。运动员.javapublic interface 运动员 public vo 跑(); public void 跳();足球运动员.javapublic class 足球运动员 implements 运动员 public void 跑() /跑啊跑 public void 跳() /跳啊跳 篮球运动员.javapublic class 篮球运动员

5、implements 运动员 public void 跑() /do nothing public void 跳() /do nothing 体育协会.javapublic class 体育协会 public ic 运动员 注册足球运动员() return new 足球运动员(); public static 运动员 注册篮球运动员() return new 篮球运动员(); 俱乐部.javapublic class 俱乐部 private 运动员 守门员; private 运动员 后卫; private 运动员 前锋; public void test() this.前锋 = 体育协会.注册

6、足球运动员(); this.后卫 = 体育协会.注册足球运动员(); this.守门员 = 体育协会.注册足球运动员(); 守门员.跑(); 后卫.跳(); 以上就是容易工厂模式的一个容易实例,读者应当想象不用接口不用工厂而把详细类裸露给客户端的那种混乱情形吧(就好似没了体育总局,各个俱乐部在市场上自己胡乱的寻觅认真需要的运动员),容易工厂就解决了这种混乱。 我们用ocp看看容易工厂,会发觉假如要对系统举行扩展的话治需要增强实现产品接口的产品类(上例表现为“足球运动员”,“篮球运动员”类,比如要增强个“乒乓球运动员”类),而无需对原有的产品类举行修改。这咋一看好似满足ocp,但是事实上还是需要

7、修改代码的对,就是修改工厂类。上例中假如增强“乒乓球运动员”产品类,就必需相应的修改“体育协会”工厂类,增强个“注册乒乓球运动员”办法。所以可以看出,容易工厂模式是不满足ocp的。 工厂办法模式及其实例前一节的最末点明白容易工厂模式最大的缺点不彻低满足ocp。为了解决这一缺点,设计师们提出了工厂办法模式。工厂办法模式和容易工厂模式最大的不同在于,容易工厂模式惟独一个(对于一个项目或者一个自立模块而言)工厂类,而工厂办法模式有一组实现了相同接口的工厂类。下面我们通过修改上一节的实例来介绍工厂办法模式。我们在不转变产品类(“足球运动员”类和“篮球运动员”类)的状况下,修改下工厂类的结构,如下图所示

8、:运动员.javapublic interface 运动员 public void 跑(); public void 跳();足球运动员.javapublic class 足球运动员 implements 运动员 public void 跑() /跑啊跑 public void 跳() /跳啊跳 篮球运动员.javapublic class 篮球运动员 implements 运动员 public void 跑() /do nothing public void 跳() /do nothing 体育协会.javapublic interface 体育协会 public 运动员 注册();足球协会

9、.javapublic class 足球协会 implements 体育协会 public 运动员 注册() return new 足球运动员(); 篮球协会.javapublic class 篮球协会 implements 体育协会 public 运动员 注册() return new 篮球运动员(); 俱乐部.javapublic class 俱乐部 private 运动员 守门员; private 运动员 后卫; private 运动员 前锋; public void test() 体育协会 中国足协 = new 足球协会(); this.前锋 = 中国足协.注册(); this.后卫 = 中国足协.注册(); 守门员.跑(); 后卫.跳(); 很显然可以看到,“体育协会”工厂类变成了“体育协会”接口,而

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论