Factory Method 工厂方法_第1页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

1、factory method 工厂方法factory method(工厂办法) factory method(工厂办法)属于创建型模式,利用工厂办法创建对象实例而不是挺直用 new 关键字实例化。 理解如何写出工厂办法很容易,但理解为什么要用工厂办法就需要动动脑子了。工厂办法看似容易的将 new 替换为一个函数,其实是体现了面对接口编程的思路,它创建的对象其实是一个符合通用接口的通用对象,这个对象的详细实现可以任意替换,以达到通用性目的。 意图:定义一个用于创建对象的接口,让子类打算实例化哪一个类。factory method 使一个类的实例化延迟到其子类。 举例子 假如看不懂上面的意图介绍,

2、没有关系,设计模式需要在日常工作里用起来,结合例子可以加深你的理解,下面我预备了三个例子,让你体味什么场景下会用到这种设计模式。 换灯泡 我自己在家换过灯泡,以前我家里灯坏掉的时候,我看着这个奇形怪状的灯管,心里想,这种灯泡和这个灯座应当是一体的,市场上估量很难买到适配我这个灯座的灯泡了。结果等我把灯泡拧下来,跑到门口的五金店去换的时候,店员任凭给了我一个灯泡,我回去任凭拧了一下竟然就能用了。 我买这个灯泡的过程就用到了工厂模式,而正是得益于这种模式,让我可以便利在家门口就买到可以用的灯泡。 卡牌对战嬉戏 卡牌对战中,卡牌有一些基本属性,比如攻防、生命值,也符合一些通用商定,比如一回合出击一起

3、等等,那么对于战争系统来说,应当怎样实例化卡牌呢?如何批量操作卡牌,而不是通用功能也要拿到每个卡牌的实例才干调用?另外每个卡牌有特别能力,这些特别能力又应当如何拓展呢? 实现随意图形拖拽系统 一个可以被交互操作的图形,它可以用鼠标举行拉伸、旋转或者移动,不同图形实现这些操作可能并不相同,要存储的数据也不一样,这些数据应当自立于图形存储,我们的系统假如要对接随意多的图形,具备强大拓展能力,对象关系应当如何设计呢? 意图说明 在用法工厂办法之前,我们就要创建一个 用于创建对象的接口,这个接口具备通用性,所以我们可以忽视不同的实现来做一些通用的事情。 换灯泡的例子来说,我去门口五金店买灯泡,而不是拿

4、到灯泡材料自己 new 一个出来,就是由于五金店这个 工厂 提供应我的灯泡符合国家接口标准,而我家里的灯座也符合这个标准,所以灯座不需要知道对接的灯泡是详细哪个实例,什么色彩,什么外形,这些都无所谓,只要灯泡符合国家标准接口,就可以对接上。 对卡牌对战的系统来说,全部卡牌都应当实现同一种接口,所以卡牌对战系统拿到的卡牌应当就是容易的 card 类型,这种类型具备基本的卡片操作交互能力,系统就调用这些能力完成基本流程就好了,假如系统挺直实例化详细的卡片,那不同的卡片类型会导致系统难以维护,卡片间操作也无法抽象化。 正式这种模式,使得我们可以在卡牌的详细实现上做一些特别功能,比如修改卡片袭击时效果

5、,修改卡牌销毁时效果。 对图形拖拽系统来说,用到了 衔接平行的类层次 这个特性,所谓衔接平行的类层次,就是指一个图形,与其对应的操作类是一个平行抽象类,而一个详细的图形与详细的操作类则是另一个平行关系,系统只要关注最抽象的 通用图形类 与 通用操作类 即可,操作时,底层可能是某个详细的 圆类 与 圆操作类 结合用法,详细的类有不同的实现,但都符合同一种接口,因此操作系统才可以把它们等量齐观,统一操作。 意图:定义一个用于创建对象的接口,让子类打算实例化哪一个类。factory method 使一个类的实例化延迟到其子类。 所以接口是十分重要的,工厂办法第一句话就是 定义一个用于创建对象的接口,

6、这个接口就是 creator,让子类,也就是详细的创建类(concretecreator)打算要实例化哪个类(concreteproduct)。 所谓使一个类的实例化延迟到其子类,是由于抽象类不知道要实例化哪个详细类,所以实例化动作只能由详细的子类去做,这样绕一圈的益处是,我们可以将随意多对象看作是同一类事物,做统一的处理,比如 无论何种灯泡实例都满足通用的灯座接口,全部工厂实例化的卡牌都具备玩一局卡牌嬉戏的基本功能,任何图形与交互类都满足特定功能关系,这种思想让生活和设计得到了大幅简化。 结构图 creator 就是工厂办法,concretecreator 是实现了 creator 的详细工

7、厂办法,每一个详细工厂办法生产一个详细的产品 concreteproduct,每个详细的产品都实现通用产品的特性 product。 代码例子 下面例子用法 typescript 编写。 / 产品接口 interface product save: () => void; / 工厂接口 interface creator createproduct: () => product; / 详细产品 class concreteproduct implements product save = () => ; / 详细工厂 class concretecreator implemen

8、ts creator createproduct = () => return new concreteproduct(); ; 创建一个 product 的子类 concretecreator,并返回一个实现了 product 的详细实例 concreteproduct,这样我们就可以便利用法这个工厂了。 工厂办法并不是挺直调用 new concretecreator().createproduct 那么容易,这样体现不出任何抽象性,真正的场景是,在一个创建产品的流程中,我们只知道拿到的工厂是 creator: function main(anycreator: creator) co

9、nst product = anycreator.createproduct() 在外面调用 main 函数时,实际传进去的是一个详细工厂,比如 mycreator,但关键是 main 函数不用关怀到底是哪一个详细工厂,只要知道是个工厂就行了,详细对象创建过程交给了其子类。 你大概也发觉了,这就是抽象工厂中其中的一步,所以抽象工厂用法了工厂办法。 弊端 工厂办法中,每创建一种详细的子类,就要写一个对应的 concretecreate,这相对照较粗笨,但故意思的是,假如将创建多个对象放到一个 concretecreate 中,就变成了 容易工厂模式,新增产品要修改已有类不符合开闭模式,反而推举写成本文说的这种模式。 彼之毒药吾之蜜糖,要知道没有一种设计模式解

温馨提示

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

评论

0/150

提交评论