抽象工厂模式


转载自:https://www.shiyanlou.com/courses/document/867


一、本节目标

我们本节课程主要介绍【抽象工厂模式】的相关知识,将会涉及以下内容:

  • 什么是抽象工厂模式
  • 抽象工厂模式类图
  • 抽象工厂模式代码
  • 抽象工厂模式应用
  • 工厂方法模式、抽象工厂模式区别

二、什么是 抽象工厂模式

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

三、 抽象工厂模式类图

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

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

四、 抽象工厂模式示例代码

Talk is cheap, show me the code.

// 抽象工厂
public interface KitchenFactory {public Food getFood();public TableWare getTableWare();
}// 抽象食物
public interface Food {public String getFoodName();
}// 抽象餐具
public interface TableWare {public String getToolName();
}// 以具体工厂 AKitchen 为例
public class AKitchen implements KitchenFactory {public Food getFood() {return new Apple();}public TableWare getTableWare() {return new Knife();}
}// 具体食物 Apple 的定义如下
public class Apple implements Food{public String getFoodName() {return 'apple';}
}// 具体餐具 Knife 的定义如下
public class Knife implements TableWare { public String getToolName() {return '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);}
}

五、抽象工厂模式应用

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

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

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

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

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

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

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

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

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

吃货们,懂了吧?

七、小结

国际惯例,总个结。本次课程我们做了一回吃货,学习了【抽象工厂模式】的相关知识。

八、参考文档

  • Java Design Pattern: Abstract Factory
  • 抽象工厂模式解析例子

抽象工厂模式,工厂方法模式区别相关推荐

  1. 工厂方法模式与抽象工厂模式的区别

    工厂方法模式: 一个抽象产品类,可以派生出多个具体产品类. 一个抽象工厂类,可以派生出多个具体工厂类. 每个具体工厂类只能创建一个具体产品类的实例. 抽象工厂模式: 多个抽象产品类,每个抽象产品类可以 ...

  2. 抽象工厂模式-与-工厂方法模式区别

    转自:http://blog.csdn.net/wangwenhui11/article/details/3955125 --------------------------------- 对于jav ...

  3. 021 设计模式之工厂方法模式,抽象工厂模式的区别

    简单工厂模式,工厂方法模式和抽象工厂模式的异同 简单工厂模式,工厂方法模式和抽象工厂模式都是属于创建型设计模式,这三种创建型模式都不需要知道具体类.我们掌握一种思想,就是在创建一个对象时,需要把容易发 ...

  4. 抽象工厂模式java_面试官:说一下静态工厂模式,工厂方法模式,抽象工厂的区别吧...

    静态工厂模式 用生活中的场景类比一下这三种模式,假如你想学习Java视频,你得自己到处去找资料,找资料是一个繁琐的过程,过一段时间你又想学Python视频了,你还得去找资料.现在你在学校上学,你想学J ...

  5. 设计模式学习笔记(三)工厂模式中的简单工厂、工厂方法和抽象工厂模式之间的区别

    设计模式中的工厂模式(Factory Design pattern)是一个比较常用的创建型设计模式,其中可以细分为三种:简单工厂(Simple Factory).工厂方法(Factory Method ...

  6. 工厂模式 工厂方法模式 抽象工厂模式 简单工厂模式 工厂模式于抽象工厂的区别 设计模式

    工厂模式 定义一个用于创建对象的接口,让子类实现具体类的创建.工厂将类的实例化延迟的子类. 良好的分装性.对于具体产品,只要知道产品名称即可(类名或字符串),封闭了对产品创建的细节. 屏蔽具体产品类. ...

  7. 简单工厂模式、工厂方法模式与抽象工厂模式的区别(转)

    虽然看完了<大话设计模式>,但是工厂模式的三种类型之间的差异,理解还不是非常透彻,那么本文就围绕三者间的差异性来阐述各自的优缺点. 简单工厂模式 (Simple Factory) 首先定义 ...

  8. UML图解简单工厂模式工厂方法模式抽象工厂模式区别

    简述 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一: 工厂模式包含 简单工厂模式& 工厂方法模式& 抽象工厂模式这三种: 这三者主要区别在于工厂实现的 ...

  9. Java设计模式-工厂方法模式和抽象工厂模式

    工厂方法模式定义: 即定义一个创建对象的接口(即抽象工厂类),让其子类(具体工厂类)决定实例化哪一个类(具体产品类)."一对一"的关系 1,一抽象工厂类派生出多个具体工厂类: 2, ...

最新文章

  1. 彻底解决_OBJC_CLASS_$_某文件名, referenced from:问题
  2. 线性代数行列式计算之升阶法
  3. 装上后这 14 个插件后,PyCharm 能飞起
  4. 为什么苹果6没有录屏_为什么苹果手机受欢迎?因为没有一部安卓手机是“干净”的...
  5. 大话数据结构之算法 时间复杂度
  6. ID3的REP(Reduced Error Pruning)剪枝代码详细解释+周志华《机器学习》决策树图4.5、图4.6、图4.7绘制
  7. zookeeper入门系列
  8. Asp.net MVC使用Filter解除Session, Cookie等依赖
  9. 信息学奥赛一本通 1982:【19CSPJ普及组】数字游戏
  10. c语言程序设计 a b,用C语言编程时,a+=b 和 a=a+b 真的完全等价吗?
  11. Apache 跟踪用户会话
  12. Windows系统经典高级技巧分享
  13. win10系统安装sql不上服务器,win10安装sql2000没有反应怎么办_win10安装不了sql2000的解决方法...
  14. 微信小程序 录音之获取、保存、读取
  15. html仿360首页动画效果图,仿360影视网站模板html源码
  16. 为什么a标签不能设置宽高?
  17. <RTL coding的艺术> non-constant expression引出的思考
  18. 嵌入式linux 修改mac,MAC to MAC 环境下,嵌入式linux的修改
  19. shell一键部署mysql
  20. 联想ThinkPad笔记本预装win10改为win7

热门文章

  1. Web安全:常见的安全问题及防范措施
  2. (基于安卓app开发毕业设计)上课考勤管理(附源码+论文)
  3. 天线下倾角示意图_天线下倾角的计算方法
  4. Python开发技巧-教你制作Python进度条
  5. GNU/Linux话题
  6. [ERROR] Plugin org.apache.maven.plugins:maven-archetype-plugin:RELEASE or one of its dependencies...
  7. 企鹅号怎么营运;企鹅号这样赚钱
  8. 企鹅号发视频技巧视频推荐技巧企鹅号发视频重复,不推荐怎么办呢?
  9. centos7克隆虚拟机完成后的的一些配置介绍
  10. 判断正规的股票杠杆平台?五大特点请查收