点开这篇着你已经大致对工厂方法有了一定的了解。但为什么依然对这两者的区别不是很明白,在搜索了一天、看了许多文章后我有了一点想法,在这里分享并记录一下。

引用SO的一段文字:

One difference between the two is that with the Abstract Factory pattern, a class delegates the responsibility of object instantiation to another object via composition whereas the Factory Method pattern uses inheritance and relies on a subclass to handle the desired object instantiation.

这是说,Factory Method采用继承的方式,将创建产品推迟到子类;而Factory Abstract采用组合的方式,将一系列相关的产品组合到一起。

其实抽象工厂中的每一个创建产品的接口都是一个工厂方法,只不过工厂方法创建一个产品,而抽象工厂创建一系列产品

有个例子觉得非常简单又能说明问题:Shape。

假设现在有Circle和Rectangle两种Shape,而Client代码需要根据情况创建一个具体的Shape。

Factory Method:

工厂方法由接口IShapeFactory中的CreateShape提供,方法创建一个Shape,但至于具体返回怎样的Shape,是由子类来完成的。对于CircleFactory,它实现工厂方法并返回一个Circle对象,RectangleFactory工厂则返回一个Rectangle对象。

好了,现在Client代码想要一个Circle对象,则它不用自己出马,请具体的工厂来代工。

IShapeFactory shapeFactory = new CircleFactory()//创建一个可以生产Circle的工厂
Shape shape = shapeFactory.CreateShape();//Circle工厂负责创建一个Circle产品
//Now, client could use this 'Circle' shape happily...

现在,你希望创建一个带有颜色的Shape,比如RedCircle、GreenRectangle等等组合。在你手上有许多Shape,也买好了许多颜料,你希望工厂能够为你生产五颜六色的产品。依靠工厂模式的思想,将具体类的实例化与客户代码分离,由工厂负责生产具体的产品。

RedCircle产品 = Circle产品 + Red产品

每个工厂实际上要将有关系的产品组合在一起,为你创建出一个完整的产品。我想这就是为什么SO那段引用里说“抽象工厂模式利用组合”的原因吧。

Abstract Factory:

这张图看起来复杂,其实很简单不要慌张。

与Factory Method不同的是,Abstract Factory只是能够生产一系列产品而已。它的做法无非是将相关的产品放在一起,由工厂一个个地来生产它们。你很聪明,其实抽象工厂里隐含着工厂方法的影子!一个个地CreateXXX其实就是工厂方法嘛。

你想要一个绿色的矩形:

IColorfulShapeFactory greenRectangleFactory = new GreenRectangleFactory();//请绿色矩形工厂来生产
ColorfulShape colorfulShape = new ColorfulShape(greenRectangleFactory);//使用绿色矩形工厂生产的产品来实例化一个具体的GreenRectangle
//Now, 你可以为所欲为了...

与Factory Method略有不同的是,由于Abstract Factory生产一组产品,而你要的是一个完整的产品(它由这一组子产品构成),因此在ColorfulShape中,我们把工厂生产的产品用来初始化,这样就构成了一个完整的产品。

Conclusion:

1. Factory Method 生产一个产品;Abstract Factory 生产一组产品;

2. 在 Factory Method 中,每一个CreateXXX方法实际上都是一个Factory Method ;

3. 当需要扩展一个产品时,对于工厂方法来说只需要再实现一个生产这个产品的工厂就可以了,而对于抽象工厂来讲,因为最终的产品是由许多子产品组合而成的,因此就显得麻烦了多:

还是以ColorfulShape产品为例。

a. 改动发生在原子产品上,如增加一个蓝色,那只需要实现几个能够生产BlueShape的工厂;

b. 改动发生在新子产品上,如你又想为ColorfulShape增加一个特性-----夹心材料(假设你在生产一款五颜六色、形状各异的夹心糖果,p.s.我实在想不来加什么属性好了。。),那就需要更改抽象工厂的接口,并牵连至所有实现了该接口的具体工厂!

可以看到,不论如何改动都比Factory Method来的大。

=====

以上是个人的一些理解,希望在没有误导你的前提下,对你能够有些帮助。不妥之处还恳请指出。



Factory Method vs Abstract Factory相关推荐

  1. 我的实用设计模式之Simple Factory,Factory Method和Abstract Factory

    更新1:更新Factory Method部分,说明文中使用"参数化工厂方法"的实现,同时加入经典Factory Method的实现进行比较. 更新2:更新Abstract Fact ...

  2. 设计模式学习每天一个——Factory模式 和 Abstract Factory模式

    工厂模式与抽象工厂模式的区别 转载于:https://www.cnblogs.com/windy86/p/4022551.html

  3. Factory Method模式的误区:Factory Method模式是简化版的Abstract Factory吗?

    FactoryMethod是一个相对比较简单的创建型模式,但是能领悟或者用对的并不多见:很多示例都没有反应出Factory Method的核心思想,只是实现了一个简化版的Abstract Factor ...

  4. Factory Method工厂方法

    "对象创建"模式 通过"对象创建"模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(以来具体类),从而支持对象创建的稳定.它是接口抽象之后的第一部工 ...

  5. 设计模式学习笔记三——Abstract Factory模式

    动机:实现一系列相互依赖对象的创建,通过封装系列对象创建来隔离对象创建和客户程序,从而能够灵活提供更多系列对象创建和系列对象间的切换,而不需要改变客户程序. 应用:多种风格软件界面控件的创建.对应多种 ...

  6. 艾伟:C# Design Patterns (1) - Factory Method

    Simple Factory Pattern (简单工厂模式) 特性: 把类的实例化工作,集中到一个「工厂类」去处理,亦即将 new instance 的工作,都交给一个「工厂」去处理,而不要分散写在 ...

  7. 设计模式学习之Factory Method模式和Abstract Factory模式

    终于到了工厂模式了,说起工厂模式,不得不把工厂方法模式和抽象工厂模式结合起来说,这两种模式都有工厂,乍听起来还真容易混淆,但它们却是不相同的两种模式,但又互相有联系.那么这两者之间各有什么用途,互相之 ...

  8. 设计模式(2)——创建型——工厂相关:简单工厂(Simple factory),工厂方法(Factory method),抽象工厂(Abstract factory)

    概要 这里试图描述23个设计模式中的两个工厂(Factory)相关的设计模式:工厂方法(Factorymethod),抽象工厂(Abstract factory). 注意点: 这两个都属于创建型设计模 ...

  9. 设计模式之工厂方法模式(Factory Method)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式包括:1.FactoryMethod(工厂方法模式):2.Abstract Factory(抽象工厂模式):3.Sin ...

最新文章

  1. Socket通信之操作系统的字节序和位数
  2. 学习AI方向大半年,为什么你还没有别人几个月更精通?
  3. 共面阻抗对高频PCB 设计中传输线阻抗控制的影响
  4. [Java基础]Map集合的遍历
  5. big sur卡第二阶段无限重启_2019百大球员第67:克林特卡佩拉,一张饼一辈子
  6. CIALBrowser
  7. 8255总线实验 编写程序利用8255扩展单片机的IO口,控制8位数码管显示1-8。
  8. 【多目标优化求解】基于matlab遗传优化萤火虫算法求解多目标优化问题【含Matlab源码 1484期】
  9. 【面试必会】java分布式事务面试题
  10. matlab实现混沌系统最大李雅普诺夫指数
  11. js经纬度坐标和度分秒互转
  12. 阿里云服务器公网带宽下载上传速度及测速Ping值测试工具
  13. 关于新加坡的身份证与电话号码验证
  14. Latex参考文献引用顺序排序
  15. 解决阿里云ESC启动kube-proxy服务时出现错误 亲测有效
  16. Ubuntu 20.04 更新软件依赖,源 ,删除软件三个常用指令
  17. iOS让屏幕保持常亮,不自动锁屏
  18. 新零售时代,异业联盟怎么做?
  19. 服务器到底是个什么东东?跟电脑有啥区别?
  20. xshell6设置选中复制 右键粘贴复制内容

热门文章

  1. 天猫魔盒改无线打印服务器,图文教学天猫魔盒如何设置WIFI的过程
  2. 读书笔记:Python编程——从入门到实践
  3. Linux 抓取网页实例(shell+awk)
  4. 对立色彩空间_复制的对立面是什么?
  5. 微服务平台之网关架构与应用
  6. elementUI表单验证之动态表单验证
  7. springcloud五大神兽之Eureka介绍
  8. 怎么用手机里的计算机玩游戏,黑鲨手机怎么玩电脑上游戏
  9. 企业数字化转型“核心方法论”
  10. JS类教程 Lynda中文