模式总结之工厂三模式: 简单工厂模式 Vs 抽象工厂模式 Vs 工厂方法模式
模式总结之工厂三模式: 简单工厂模式 Vs 抽象工厂模式 Vs 工厂方法模式
刀狂剑痴 发表于2年前
模式总结之工厂三模式: 简单工厂模式 Vs 抽象工厂模式 Vs 工厂方法模式
  • 发表于 2年前
  • 阅读 56
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 新注册用户 域名抢购1元起>>>   

本文对比简单工厂、抽象工厂、工厂方法三个模式,有列举出UML图,但是没有java代码,再后面有生动地形象的列举。

先上UML图

简单工厂模式:

s1

工厂方法模式:

s2

抽象工厂模式:

s3

举例说明这三个模式

简单工厂模式:三国街街头,张飞和儿子张苞一起开了个肉铺,客人只要说来份好爸爸猪肉或者好儿子猪肉,张飞或者张苞就会给客人杀完猪,切完肉,然后交给客人。 

工厂方法模式:三国街街尾,关羽开了一家好爸爸红枣店,专门卖好爸爸红枣。他儿子关兴也开了一家好儿子红枣店,专门卖好儿子红枣。客人只要走到关羽的店子,说来份枣,关羽直接就给客人包裹了一袋好爸爸红枣。走到关兴的店说来份枣,关兴给客人包裹了一袋好儿子红枣。 

抽象工厂模式:后来经济不景气,三国街竞争太大,张家与关家决定联合起来!街头,关羽与张飞开了家好爸爸农副产品店,买好爸爸猪肉和好爸爸红枣,客人说来份肉或枣,就可以直接给客人买好爸爸猪肉或好爸爸红枣。街尾,关兴与张苞开了家好儿子农副产品店,客人说来份肉或枣,就可以直接给客人买好儿子猪肉或好爸爸红枣。 

在上面的例子中,店铺就是工厂,猪肉与红枣就是产品族,好爸爸红枣店、好儿子红枣店是工厂店的实现类,好爸爸猪肉、好儿子猪肉、好爸爸红枣、好儿子红枣就是具体产品,好爸爸红枣点,好儿子红枣点,好爸爸农副产品店,好儿子农副产品店是具体的工厂。

横向对比三者的优劣

简单工厂: 优点是调用者不用创建产品对象,只要传递种类信息即可,这样外界与具体类实现了隔离。缺点是工厂类有判断逻辑,扩展困难,违反了开闭原则,而且如果工厂类出问题,系统可能都会受影响。 用上面了例子来说,优点是客人不用走到具体的店铺,只要走到张飞肉铺(不像第二个例子的红枣店,得去两个不同的店铺),说出想要的肉即可。缺点是只有一个店铺,如果店铺出问题了,那就卖不出肉了,而且以后要想卖好老婆猪肉,好媳妇猪肉,店铺就会变得臃肿,还有每种肉处理流程不一样,在一起卖杀猪放配料可能会搞混。 

工厂方法: 优点是克服了简单工厂的缺点,符合开闭原则,容易扩展。缺点是当修改具体产品类时,对应的工厂类也得修改,当修改多个产品类时,那就相当麻烦。 用到上面例子中,优点就是卖红枣时流程不会搞混,不管以后再卖好媳妇红枣,好老婆红枣只要开新店,完全没问题。缺点就是如果忽然上级命令所有农副产品必须用双氧水消毒,那么关羽家族的所有店铺都必须修改流程,添加双氧水,而第一个例子中的张飞家族就没有这个顾虑。 

抽象工厂: 优点是一个工厂封装创建产品对象的责任和过程,它将客户与类的实现分离,只需改变具体的工厂就可以使用不同的产品配置,有利于产品的一致性,当一个系列中的产品对象被设计成一起工作时,一个应用一次只能使用同一个系列中的对象。缺点是难以支持新的产品等级结构,支持新的产品等级结构就要扩展抽象工厂接口。 用第三个例子解释就是,每个农副产品铺子都有特有的主题,如好爸爸/好儿子,提供好爸爸/好儿子系列产品,可能爸爸们喜欢熟透的东西,儿子们喜欢加辣,所以可以统一给所有产品加辣,节省流程。缺点是如果农副产品店又说要买刘备家草鞋,那么所有的农副产品店都要添加草鞋产品。

适用范围

简单工厂:工厂类负责创建的对象比较少,客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心。 

工厂方法:当一个类不知道它所必须创建对象的类或一个类希望由子类来指定它所创建的对象时,当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候,可以使用工厂方法。 

抽象工厂:一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有形态的工厂模式都是重要的。这个系统有多于一个的产品族,而系统只消费其中某一产品族。同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现。 总而言之,无论是简单工厂模式、工厂模式还是抽象工厂模式,它们本质上都是将不变的部分提取出来,将可变的部分留作接口,以达到最大程度上的复用。究竟用哪种设计模式更适合,这要根据具体的业务需求来决定。

共有 人打赏支持
粉丝 18
博文 111
码字总数 82582
×
刀狂剑痴
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: