什么是抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)是一种软件开发设计模式。抽象工厂模式提供了一种方式,可以将一组具有同一主题的单独的工厂封装起来。如果比较抽象工厂模式和工厂模式,我们不难发现前者只是在工厂模式之上增加了一层抽象的概念。抽象工厂是一个父类工厂,可以创建其它工厂类。所以我们也叫它 “工厂的工厂”。(想想上节课的 “女娲娘娘”,这简直就是 “女娲娘娘的亲娘” 啊...)

抽象工厂模式类图

“女娲娘娘”只有一个,而我们的工厂却可以有多个,因此在这里用作例子就不合适了。作为“女娲娘娘”生产出来的男人女人们,那就让我们来当一次吃货吧。(吃的东西总可以任性多来一点...)

现在,假设我们有 A、B 两个厨房。每个厨房拥有的餐具和食品都不一样,但是用户搭配使用的方式,比如刀子和苹果、杯子和牛奶等等,我们假设是一致的。

示例代码

在project中新建Foodaholic.java

// 抽象食物
interface Food {public String getFoodName();
}// 抽象餐具
interface TableWare {public String getToolName();
}// 抽象工厂
interface KitchenFactory {public Food getFood();public TableWare getTableWare();
}//具体食物 Apple 的定义如下
class Apple implements Food{public String getFoodName() {return "apple";}
}//具体餐具 Knife 的定义如下
class Knife implements TableWare { public String getToolName() {return "knife";}
}// 以具体工厂 AKitchen 为例
class AKitchen implements KitchenFactory {public Food getFood() {return new Apple();}public TableWare getTableWare() {return new Knife();}
}// 吃货要开吃了
public class Foodaholic {public void eat(KitchenFactory k) {System.out.println("A foodaholic is eating "+ k.getFood().getFoodName()+ " with " + k.getTableWare().getToolName() );}public static void main(String[] args) {Foodaholic fh = new Foodaholic();KitchenFactory kf = new AKitchen();fh.eat(kf);}
}

打开terminal,输入命令编译并运行:

javac Foodaholic.java
java Foodaholic

运行结果:

抽象工厂模式应用

抽象工厂模式特别适合于这样的一种产品结构:产品分为几个系列,在每个系列中,产品的布局都是类似的,在一个系列中某个位置的产品,在另一个系列中一定有一个对应的产品。这样的产品结构是存在的,这几个系列中同一位置的产品可能是互斥的,它们是针对不同客户的解决方案,每个客户都只选择其一。

工厂方法模式、抽象工厂模式区别

工厂方法模式、抽象工厂模式,傻傻分不清楚...

为了解释得更清楚,先介绍两个概念:

  • 产品等级结构:比如一个抽象类是食物,其子类有苹果、牛奶等等,则抽象食物与具体食物名称之间构成了一个产品等级结构。食物是抽象的父类,而具体的食物名称是其子类。

  • 产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品。如 AKitchen 生产的苹果、刀子,苹果属于食物产品等级结构中,而刀子则属于餐具产品等级结构中。而 BKitchen 可能生成另一组产品,如牛奶、杯子。

因此工厂方法模式、抽象工厂模式最大的区别在于:

工厂方法模式:针对的是 一个产品等级结构

抽象工厂模式:针对 多个产品等级结构

吃货们,懂了吧?

Java学习笔记之设计模式(3)抽象工厂模式相关推荐

  1. 设计模式三—抽象工厂模式

    设计模式三-抽象工厂模式 一.定义 抽象工厂模式是工厂方法模式的进一步抽象.如果产品簇中只有一种产品,则退化为工厂方法模式. 二.原理图 三.代码实例 * 苹果和土豆是园丁1的杰作 * 葡萄和西红柿是 ...

  2. python抽象工厂模式_Python设计模式之抽象工厂模式

    Python设计模式之抽象工厂模式 这篇文章主要为大家详细介绍了Python设计模式之抽象工厂模式,感兴趣的小伙伴们可以参考一下 python面向对象编程入门,我们需要不断学习进步 "&qu ...

  3. 设计模式-04抽象工厂模式

    设计模式-04抽象工厂模式 文章中涉及到的代码,请自行下载 https://gitee.com/pan_xiao_lei123/designmode.git 前面介绍的工厂方法模式中考虑的是一类产品的 ...

  4. 设计模式系列·抽象工厂模式

    前言 以小说的笔法写的设计模式系列文章,你绝对看得懂![首发于公众号:"聊聊代码"] 设计模式系列·王小二需求历险记(一) 设计模式系列·王小二需求历险记(二) 设计模式系列·封装 ...

  5. 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)

    原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页] [源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Facto ...

  6. 设计模式复习-抽象工厂模式

    设计模式复习-抽象工厂模式 有两种硬件,PC和Phone,有两种系统,Windows和Linux,现在假设PC和Phone上全都能安装这两个系统,并且将来硬件不会在变化,但是系统可能需要扩展,比如扩展 ...

  7. 设计模式之四(抽象工厂模式第三回合)

    原文:设计模式之四(抽象工厂模式第三回合) 前言 抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂模式最大的好处便是易于交换产品系列,由于具体工厂类,例如I ...

  8. C#设计模式(4)——抽象工厂模式

    C#设计模式(4)--抽象工厂模式 一.引言 在上一专题中介绍了工厂方法模式,工厂方法模式是为了克服简单工厂模式的缺点而设计出来的,简单工厂模式的工厂类随着产品类的增加需要增加额外的代码),而工厂方法 ...

  9. 设计模式之抽象工厂模式学习笔记

    前言 在学习抽象工厂模式之前,最好先学习了解简单工厂模式和工厂方法模式.这样会对学习抽象工厂模式有帮助,因为抽象工厂模式也是基于工厂方法模式的. 解释 说白了就是工厂的工厂,以一个超级工厂为核心,围绕 ...

  10. Java设计模式笔记(3)抽象工厂模式

    抽象工厂模式:为创建一组相关的或者相互依赖的对象提供一个接口,而且无需指定他们的具体类. 抽象工厂模式是工厂方法模式的升级版本,在有多个业务品种.业务分类时,通过抽象工厂模式产生需要的对象是一种非常好 ...

最新文章

  1. C++:随笔2--I/O实践
  2. 要强大的“黑匣子”,还是“可解释”的机器学习?| 清华AI Time激辩
  3. 在Redhat安装部署Apache+MySQL+PHP(LAMP)
  4. 2015第27周一非结构化数据
  5. js基础练习题 二次封装函数
  6. PPT 下载 | 神策数据刘乐:智能推荐驱动业务增长应用与实践
  7. ICE专题:实现简单的聊天室(一)
  8. Confluence Cloud的Teams Message Extension
  9. 如何用python和flask以太坊智能合约开发
  10. 谁说男生不能美美哒?2020中国男士美妆市场洞察报告.pdf(附下载链接)
  11. Intellij Idea 15 下新建 Hibernate 项目以及如何添加配置
  12. Linq把一个DataTable根据一列去除重复数据
  13. serialize和unserialize函数
  14. 需求分析岗的一点总结
  15. 运动目标检测之关键帧提取、二帧差法及三帧差法
  16. 照片变老html源码,变老教程,利用ps把年轻人变成老年人效果
  17. 2012 九月十月百度人搜,阿里巴巴,腾讯华为笔试面试八十题(第331-410题)
  18. CSP201912-3化学方程式
  19. OSChina 周五乱弹 ——国庆第六天,每逢佳节胖三斤
  20. window 删除文件报错显示被程序占用 强制删除被占用的文件

热门文章

  1. Perl的模块判断及安装
  2. 一道SQL题考你数据库的使用能力
  3. Configuration Opennebula3.8 4.x Virtual Machines Contextualizing
  4. 将CString转换成string ...
  5. Spring中的Bean可以绕过生命周期管理吗?
  6. dubbo源码之SPI机制源码
  7. LeetCode之Rectangle Overlap(Kotlin)
  8. CLR,通用语言运行时库
  9. Struts2+Spring3+MyBatis3整合以及Spring注解开发
  10. 为IT部门画一个“饼”