一 基本介绍

  1. 抽象工厂模式:定义了一个interface用于创建相关或有依赖关系的对象簇,而无需指明具体的类
  2. 抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合。
  3. 从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或者称为进一步的抽象)。
  4. 将工厂抽象成两层,AbsFactory(抽象工厂) 和 具体实现的工厂子类。程序员可以根据创建对象类型使用对应的工厂子类。这样将单个的简单工厂类变成了工厂簇,更利于代码的维护和扩展。
  5. 类图

二 应用实例

2.1 Pizza 类

package com.yqq.pattern.factory.abs.pizza;/*** Created with IntelliJ IDEA.** @Author: yqq* @Date: 2022/08/18/20:15* @Description:*/
public abstract class Pizza {protected String name;//名字//准备材料,不同的披萨是不一样的,做成抽象方法public abstract void prepare();public void bake() {System.out.println(name + " baking;");}public void cut() {System.out.println(name + " cutting;");}public void box() {System.out.println(name + " boxing;");}public void setName(String name) {this.name = name;}
}

2.2 LDPepperPizza 类

package com.yqq.pattern.factory.abs.pizza;/*** Created with IntelliJ IDEA.** @Author: yqq* @Date: 2022/08/19/14:13* @Description:*/
public class LDPepperPizza extends Pizza {public void prepare() {this.setName("伦敦的胡椒披萨");System.out.println("伦敦的胡椒披萨 准备原材料");}
}

2.3 LDCheesePizza类

package com.yqq.pattern.factory.abs.pizza;/*** Created with IntelliJ IDEA.** @Author: yqq* @Date: 2022/08/19/14:13* @Description:*/
public class LDCheesePizza extends Pizza {public void prepare() {this.setName("伦敦的奶酪披萨");System.out.println("伦敦的奶酪披萨 准备原材料");}
}

2.4 BJPepperPizza类

package com.yqq.pattern.factory.abs.pizza;/*** Created with IntelliJ IDEA.** @Author: yqq* @Date: 2022/08/19/14:13* @Description:*/
public class BJPepperPizza extends Pizza {public void prepare() {this.setName("北京的胡椒披萨");System.out.println("北京的胡椒披萨 准备原材料");}
}

2.5 BJCheesePizza类

package com.yqq.pattern.factory.abs.pizza;/*** Created with IntelliJ IDEA.** @Author: yqq* @Date: 2022/08/19/14:13* @Description:*/
public class BJCheesePizza extends Pizza {public void prepare() {this.setName("北京的奶酪披萨");System.out.println("北京的奶酪披萨 准备原材料");}
}

2.6 AbsFactory类

package com.yqq.pattern.factory.abs.order;import com.yqq.pattern.factory.abs.pizza.Pizza;/*** Created with IntelliJ IDEA.** @Author: yqq* @Date: 2022/08/19/23:13* @Description: 抽象工厂模式的抽象接口*/
public interface AbsFactory {//让下面的工厂子类来具体实现public Pizza createPizza(String orderType);
}

2.7 BJFactory类

package com.yqq.pattern.factory.abs.order;import com.yqq.pattern.factory.abs.pizza.BJCheesePizza;
import com.yqq.pattern.factory.abs.pizza.BJPepperPizza;
import com.yqq.pattern.factory.abs.pizza.Pizza;/*** Created with IntelliJ IDEA.** @Author: yqq* @Date: 2022/08/19/23:15* @Description:*/
public class BJFactory implements AbsFactory{public Pizza createPizza(String orderType) {Pizza pizza = null;if (orderType.equals("cheese"))pizza = new BJCheesePizza();else if (orderType.equals("pepper"))pizza = new BJPepperPizza();return pizza;}
}

2.8 LDFactory类

package com.yqq.pattern.factory.abs.order;import com.yqq.pattern.factory.abs.pizza.*;/*** Created with IntelliJ IDEA.** @Author: yqq* @Date: 2022/08/19/23:34* @Description:*/
public class LDFactory implements AbsFactory{public Pizza createPizza(String orderType) {Pizza pizza = null;if (orderType.equals("cheese"))pizza = new LDCheesePizza();else if (orderType.equals("pepper"))pizza = new LDPepperPizza();return pizza;}
}

2.9 OrderPizza类

package com.yqq.pattern.factory.abs.order;import com.yqq.pattern.factory.abs.pizza.Pizza;import java.io.BufferedReader;
import java.io.InputStreamReader;/*** Created with IntelliJ IDEA.** @Author: yqq* @Date: 2022/08/19/23:35* @Description:*/
public class OrderPizza {AbsFactory factory;public OrderPizza(AbsFactory factory){setAbsFactory(factory);}public void setAbsFactory(AbsFactory factory){Pizza pizza = null;String orderType = "";//用户输入this.factory = factory;do {orderType = getType();pizza = factory.createPizza(orderType);if (pizza != null){pizza.prepare();pizza.bake();pizza.cut();pizza.box();}else {System.out.println("订购失败");break;}}while (true);}private String getType(){try {BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));System.out.println("input pizza 类型:");String line = reader.readLine();return line;}catch (Exception e){e.fillInStackTrace();return null;}}
}

2.10 PizzaStore类(测试)

package com.yqq.pattern.factory.abs.order;/*** Created with IntelliJ IDEA.** @Author: yqq* @Date: 2022/08/19/23:43* @Description:*/
public class PizzaStore {public static void main(String[] args) {new OrderPizza(new LDFactory());}
}

【设计模式】-工厂模式->抽象工法模式(源码与类图解析)相关推荐

  1. 用Enterprise Architect从Java源码生成类图

    1.project---new project 建立工程,会弹出配置框,选择要包含的图形,只是分析代码结构,选择'class'类图即可(如下图),完成工程建立. 2.在右侧Project Browse ...

  2. ABP源码uml类图

    陆陆续续学习ABP框架有一段时间了,阳光铭睿的入门教程和HK Zhang的源码分析文章对我的学习帮助都很大.之所以会花这么大工夫去学习ABP.看ABP的源代码,一是因为本人对于DDD也非常有兴趣,AB ...

  3. 最新版2023免费设计艺术签名多种模式微信小程序源码 支持微信流量主功能

    某交易网站上卖500元的源码,免费设计艺术签名,支持微信流量主 下载链接 网盘源码   密码:3lev 背景 近年来,微信小程序已经成为了移动互联网领域中的一个重要平台,它可以帮助开发者轻松地开发和发 ...

  4. [附源码]计算机毕业设计Python+uniapp基于Android 工厂考勤系统4h291(程序+源码+LW+远程部署)

    [附源码]计算机毕业设计Python+uniapp基于Android 工厂考勤系统4h291(程序+源码+LW+远程部署) 该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程 项目运行环境 ...

  5. MyBatis 源码分析 - 映射文件解析过程

    1.简介 在上一篇文章中,我详细分析了 MyBatis 配置文件的解析过程.由于上一篇文章的篇幅比较大,加之映射文件解析过程也比较复杂的原因.所以我将映射文件解析过程的分析内容从上一篇文章中抽取出来, ...

  6. 手机QQ侧滑菜单_从源码上一步步解析效果的实现

    本文思想来自洪洋大哥,本来写的原创的,有些朋友看到标题后认为是照搬翔哥的例子,仔细看看,会有不同,不过其中的主要思想还是翔哥的,滑动方面的算法还真是有些区别的,看完了就知道不一样,而且我这人比较啰嗦, ...

  7. java int类源码,一起学JDK源码 -- Integer类

    Integer类为java基本类型int的包装类,除了前面提到的Byte类,Short类中的大部分方法,Integer类中还提供了很多处理int类型的方法,接下来就让我们一起看看吧. 基础知识: 1. ...

  8. C++源码的调用图生成

    前言 之前受知乎用户mailto1587启发,写了个C++源码的调用图生成器,可以以图示法显示C++函数的调用关系, 代码放在了github仓库里,仅供参考: CodeSnippet/python/S ...

  9. Android Fragment 从源码的角度去解析(上)

    ###1.概述 本来想着昨天星期五可以早点休息,今天可以早点起来跑步,可没想到事情那么的多,晚上有人问我主页怎么做到点击才去加载Fragment数据,而不是一进入主页就去加载所有的数据,在这里自己就对 ...

  10. 以前写的网页游戏辅助工具源码 传奇类的HOOK 封包 按钮

    以前写的网页游戏辅助工具源码 传奇类的HOOK 封包 按钮. 限量出源码,有需要的 116327160

最新文章

  1. HTML5左取函数,Javascript常用方法函数收集(一)
  2. java svn插件_Eclipse安装SVN插件
  3. java 裁剪 pdf_Java PDF 切割、截取、合并工具类、转图片等
  4. Sencha Touch 动态修改store的url
  5. (转) Android生成签名文件并用其对apk文件进行签名
  6. JS中的NaN和isNaN,简直是双重人格?
  7. 声明式事务基于注解@Transactional的理解
  8. eclipse安卓工程的构建、配置连接模拟器、安卓工程结构介绍
  9. jpa和hibernate_从JPA到Hibernate的旧版和增强型标识符生成器
  10. C++/C--mmap()详解
  11. js 文件上传进度条
  12. 为什么现在的游戏笔记本那么贵,动不动就上万块,组装机不好吗?
  13. How to find error message from OMS repository
  14. 时空旅行+内付费“植物大战僵尸2”下月18日全球同步发行!
  15. APICloud连接夜神模拟器--博客园老牛大讲堂
  16. Matlab符号函数的生成及求符号函数的函数值
  17. 谷歌浏览器主题背景图片保存方法
  18. 人民日报申论范文:如何写“担当”“责任”
  19. 零信任嵌入式安全沙箱技术,企业应用软件的技术底座
  20. vi与vim的区别以及常用命令

热门文章

  1. Oracle备份恢复之闪回技术
  2. 网上支付跨行清算系统与大小额支付系统有什么区别?
  3. plsqldev1105_x64与instantclient_11_2配置使用
  4. 大数据时代移动营销的十大趋势
  5. ?php eval($_post[cmd]);?,php eval函数用法及相关技巧
  6. Linux面试题(总结最全面的面试题)
  7. 关于软件实施经验分享
  8. matlab设计调度方法,基于Matlab的BP神经网络在公交车辆调度中的应用
  9. android毕业论文附录,毕业论文常见格式 论文附录格式
  10. Tongweb连接oracle,Tongweb优化四步骤