您的位置:首页 > 其它

工厂模式

2015-07-04 16:11 302 查看
什么是工厂模式?

一个设计模式的名字非常之重要,他可以帮助我们理解和使用这个设计模式。工厂模式顾名思义,就是像工厂一样源源不断的给我们产生一系列的类,

我们只需要提去选择相应的车间,就能够获得与其对应的产品。在java中我们使用工厂模式来代替new操作,通过工厂方法来得到我们需要的对象。

工厂模式主要分为三种,一种是简单工厂模式,一种是工厂模式,一种是抽象工厂模式。

工厂模式实现原理与适用场景?

工厂模式的原理简单来说,就是定义一个接口来创建对象,然后让其子类具体的去决定哪些类需要被实例化。工厂方法把实例化的工作

推迟到子类中去执行。在一组类似的对象需要创建的时候,在编码时不能预见需要创建那种类的实例,考虑其扩展性,我们不需要去关

注产品的产生过程,只需要专注于他的结果。

简单工厂模式?

简单工厂模式(simple factory)是类的创建模式,又叫静态工厂方法(static factory method)模式。简单工厂模式就是由一个工厂类根据传入的参数决定创建哪一种的产品类。

这里我们举一个生活中的场景,我们的小龙同志是一位年满20岁的骚年,一直想找一个女朋友,他想找一位可爱型的小萝莉,就让朋友给介绍了一个可爱型的小萝莉,结果到了现场之后,他有点受不了这种说话嗲嗲的略显幼稚的萌妹子。然后就随便打发了一下,就想让朋友再给他介绍一个成熟点的知性女人。结果这天小龙去到了相亲现场,开始觉得挺好的,感觉还不错,到了晚上这个成熟的女人对小龙说,今晚我是你的人,想干什么都可以。小龙这样的单身大龄处男,哪里能受得了这样的挑逗,果断带着这个妹子,开好了房间玩了一夜的英雄联盟。结果第二天这妹子就和他分手了。可怜我们的小龙要
继续去相亲。他又得找朋友,找关系去叫别人介绍女朋友。我们说小龙这样是不是有点麻烦。我们为何不去婚介所里,把我们想要的另一半做个登记,然后让它给我们进行匹配,这样成功率会高一点,也会方便一点啦。我们说工厂模式就是类似于这种婚介所。它解决了小龙找女朋友难得问题。只要把自己想要的类型放到婚介所,然后创建女朋友的过程交给婚介所去处理,再相亲的时候就可以得到我们想要的类型;

顾名思义,这个模式本身很简单,而且使用在业务较简单的情况下。

它由三种角色组成(关系见下面的类图):

1、工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体类实现。

2、抽象产品角色:它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。

3、具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。









工厂模式?

说完简单工厂模式接下来再说一说工厂模式,工厂方法模式是使得它可以被子类继承。这样在简单工厂模式里集中在工厂方法上的压力可以由工厂方法模式里不同的工厂子类来分担。

我们接着上一个故事继续往下说,我们的小龙同志,大家都知道他最近在忙着找女朋友,奈何他的喜好繁多,他发现一个婚介所已经满足不了他的需求了,他听说有一个叫做玫瑰婚介的里面的女孩比较开发一点,所以他决定在这里面找到比较成熟开发点的女朋友,他还听说有一个叫做婚恋的婚介所里面的女孩比较靠谱一点,可以找到一个贤惠点的女朋友,他还听说有一个叫做萌萌哒的婚介所里面的萌妹子特别多,我听完小龙的故事有点鄙视的告诉他,你不累么,小龙说俺这叫广撒网你懂吧,能找到一个算一个。

它由四种角色组成(关系见下面的类图):

1、这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。
2、它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
3、抽象产品角色:它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。
4、具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。



接下来贴上实现代码:









工厂方法给我们带来了什么?

工厂方法使用一个抽象工厂角色作为核心来代替在简单工厂模式中使用具体类作为核心。让我们来看看工厂方法模式给我们带来了什么?使用开闭原则来分析下工厂方法模式。当有新的产品(即小龙的新女朋友)产生时,只要按照抽象产品角色、抽象工厂角色提供的合同来生成,那么就可以被客户使用,而不必去修改任何已有的代码。看来,工厂方法模式是完全符合开闭原则的!

使用工厂方法模式足以应付我们可能遇到的大部分业务需求。但是当产品种类非常多时,就会出现大量的与之对应的工厂类,这不应该是我们所希望的。所以我建议在这种情况下使用简单工厂模式与工厂方法模式相结合的方式来减少工厂类:即对于产品树上类似的种类(一般是树的叶子中互为兄弟的)使用简单工厂模式来实现。

当然特殊的情况,就要特殊对待了:对于系统中存在不同的产品树,而且产品树上存在产品族,那么这种情况下就可能可以使用抽象工厂模式了。

小结

让我们来看看简单工厂模式、工厂方法模式给我们的启迪:

如果不使用工厂模式来实现我们的例子,也许代码会减少很多--只需要实现已有的,不使用多态。但是在可维护性上,可扩展性上是非常差的(你可以想象一下,添加一种女朋友后要牵动的类)。因此为了提高扩展性和维护性,多写些代码是值得的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: