工厂方法PK抽象工厂

       上篇博客总结的是简单工厂和工厂方法的异同,详见《简单工程PK工厂方法》。这次就来聊聊工厂家族最后一个成员——抽象工厂

1抽象工厂


1.1定义:

    提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

1.2UML结构图:

  • AbstractProductA(B):抽象产品,因为是抽象产品,所以有可能有不同的实现方法。
  • ProductA1  ProductA2 ProductB1 ProductB2 都是两个抽象产品的具体分类的实现。
  • AbstractFactory:抽象工厂,具体的工厂去继承这个抽象工厂。





1.3UML实例





下图是这个例子使用工厂方法的类图:


1.4自己的理解


      抽象工厂可以生产出更多类型的产品。相当于把工厂方法进一步扩大他的"业务范围"。 例如:一家服装的公司,它只卖服装,这个时候它是工厂方法,后来它既卖衣服还卖鞋,这种涉及到多个产品系列的问题,就需要抽象工厂的来解决。衣服和鞋子的实现方法肯定是不同的,所以我们需要一个抽象产品,让不同结构的产品实现这个接口。而衣服鞋子又分为男人穿的和女人穿的。让男装工厂(具体工厂)去生产男装和男鞋(具体产品),女装工厂去生产女装和女鞋.


2 工厂方法和抽象工厂的异同


     1.从以上两张类图,可以清楚的看出两者的区别,工厂方法:抽象产品只有一个类的时候,这种模式就是工厂方          法;当出现多个类的时候,就是抽象工厂。所以说抽象工厂是工厂方法的升级版。

     2.工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则是针对的多个产品等级结构。在编程中,通常一        个产品结构,表现为一个接口或者抽象类,也就是说,工厂方法模式提供的所有产品都是衍生自同一个接口或抽        象类,而抽象工厂模式所提供的产品则是衍生自不同的接口或抽象类。


3 抽象工厂的优缺点


  优点:


    1.封装性:软件设计强调面向接口编程,不要面向过程编程,抽象工厂这一点做的很好,我们不需要知道产品是如     何被实现的,实现类不是高层模块所关心的,高层模块关心的是谁负责这个产品,谁能生产出来这个产品,所以只     要知道这个接口就行了,各个工厂把具体的实现方法封装到自己的模块中,而只对外开放一个接口,达到解耦的目     的

    2.最主要的优点就是可以在类的内部对产品族进行约束。所谓的产品族,一般或多或少的都存在一定的关联,抽象     工厂模式就可以在类内部对产品族的关联关系进行定义和描述,而不必专门引入一个新的类来进行管理。(但是这     个优点我不是很理解)


   缺点:

     产品族扩展困难,如果要增加一个产品C,我们就要修改AbstractFactory添加createProductC()的方法,所有具体     实现类都要进行修改,这就违背了开闭原则。但是产品等级扩展很容易,接着上边我举得服装的例子,如果要添加     一个包包的产品,那么就要在男装女装工厂分别添加生产包包的方法,这就需要更改已经完成的代码,违反开闭原     则。但是如果我要生产儿童的服装,只需在拓展出一个儿童工厂就可以了,这不是遵循开闭原则的。

4总结:

       工厂家族的结构都非常的相似,无非是抽象的层次有所不同。其实在应用中,这三种模式也不是一成不变的,他们经常相互作用演化出不同的样式,这就需要我在今后的日子中多琢磨他们的关系,抓住他们各自的特点,现在觉得设计模式越来越好玩了~


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 20
    评论
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值