1.什么是抽象工厂模式?

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

我们仍然以上一篇文章的案例为主,画出抽象工厂模式下的类图。


2.案例代码

首先仍然是Pizza种类相关的几个类。

package com.szh.factory.abstractfactory.pizza;/*** 声明Pizza类为抽象类*/
public abstract class Pizza {//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;}
}
package com.szh.factory.abstractfactory.pizza;public class LDPepperPizza extends Pizza {@Overridepublic void prepare() {setName("伦敦的胡椒pizza");System.out.println("伦敦的胡椒pizza 准备原材料");}}
package com.szh.factory.abstractfactory.pizza;public class LDCheesePizza extends Pizza {@Overridepublic void prepare() {setName("伦敦的奶酪pizza");System.out.println("伦敦的奶酪pizza 准备原材料");}}
package com.szh.factory.abstractfactory.pizza;public class BJPepperPizza extends Pizza {@Overridepublic void prepare() {setName("北京的胡椒pizza");System.out.println("北京的胡椒pizza 准备原材料");}}
package com.szh.factory.abstractfactory.pizza;public class BJCheesePizza extends Pizza {@Overridepublic void prepare() {setName("北京的奶酪pizza");System.out.println("北京的奶酪pizza 准备原材料");}}

下面是抽象工厂和工厂方法的区别之处。

package com.szh.factory.abstractfactory.order;import com.szh.factory.abstractfactory.pizza.Pizza;//一个抽象工厂模式的抽象层(接口)
public interface AbsFactory {//让下面的工厂子类来具体实现public Pizza createPizza(String orderType);
}
package com.szh.abstractfactory.order;import com.szh.abstractfactory.pizza.BJCheesePizza;
import com.szh.abstractfactory.pizza.BJPepperPizza;
import com.szh.abstractfactory.pizza.Pizza;public class BJFactory implements AbsFactory {@Overridepublic Pizza createPizza(String orderType) {Pizza pizza = null;if("cheese".equals(orderType)) {pizza = new BJCheesePizza();} else if ("pepper".equals(orderType)){pizza = new BJPepperPizza();}return pizza;}
}
package com.szh.abstractfactory.order;import com.szh.abstractfactory.pizza.LDCheesePizza;
import com.szh.abstractfactory.pizza.LDPepperPizza;
import com.szh.abstractfactory.pizza.Pizza;public class LDFactory implements AbsFactory {@Overridepublic Pizza createPizza(String orderType) {Pizza pizza = null;if ("cheese".equals(orderType)) {pizza = new LDCheesePizza();} else if ("pepper".equals(orderType)) {pizza = new LDPepperPizza();}return pizza;}
}
package com.szh.factory.abstractfactory.order;import com.szh.factory.abstractfactory.pizza.Pizza;import java.util.Scanner;public class OrderPizza {AbsFactory absFactory;public OrderPizza(AbsFactory absFactory) {setFactory(absFactory);}private void setFactory(AbsFactory absFactory) {Pizza pizza = null;String orderType = ""; // 用户输入this.absFactory = absFactory;do {orderType = getType();// factory 可能是北京的工厂子类,也可能是伦敦的工厂子类pizza = absFactory.createPizza(orderType);if (pizza != null) { // 订购okpizza.prepare();pizza.bake();pizza.cut();pizza.box();} else {System.out.println("订购失败");break;}} while (true);}// 写一个方法,可以获取客户希望订购的披萨种类private String getType() {Scanner scanner = new Scanner(System.in);System.out.println("请输入 pizza 种类: ");String str = scanner.nextLine();return str;}
}

最后是测试类。

package com.szh.abstractfactory;import com.szh.abstractfactory.order.BJFactory;
import com.szh.abstractfactory.order.LDFactory;
import com.szh.abstractfactory.order.OrderPizza;import java.util.Scanner;public class MainTest {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);String content = scanner.next();if ("Beijing".equals(content)) {new OrderPizza(new BJFactory());} else if ("London".equals(content)) {new OrderPizza(new LDFactory());} else {System.out.println("无法预先匹配Pizza种类....");scanner.close();}}
}


3.工厂方法 + 抽象工厂总结

  1. 工厂模式的意义:将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖关系的解耦。从而提高项目的扩展和维护性。
  2. 遵循了依赖倒转原则:创建对象实例时,不要直接new类,而是把这个new类的动作放在一个工厂的方法中,并返回。有的书上说,变量不要直接持有具体类的引用。   不要让类继承具体类,而是继承抽象类或者是实现interface(接口)不要覆盖基类中已经实现的方法。

创建型设计模式——抽象工厂模式相关推荐

  1. 每天学习一个设计模式(八):创建型之抽象工厂模式

    目录 一.基本概念 二.通俗解释 三.应用场景 1.使用简单工厂模式的解决方案 2.抽象工厂模式 抽象工厂模式结构 在什么情况下应当使用抽象工厂模式 抽象工厂模式的起源 四.抽象工厂模式的优缺点 抽象 ...

  2. 创建型设计模式之工厂模式

    文章目录 一.工厂设计模式 二.工厂设计模式详解 1.简单工厂模式 2. 工厂方法模式 3. 抽象工厂模式 总结 一.工厂设计模式 工厂模式就类比实际生活中的工厂,在实际生活中,用户从来不会关系一个物 ...

  3. 系统架构技能之设计模式-抽象工厂模式

    一.上篇回顾 上篇我们主要讲述了简单工厂模式和工厂模式.并且分析了每种模式的应用场景和一些优缺点,我们现在来回顾一下: 简单工厂模式:一个工厂负责所有类型对象的创建,不支持无缝的新增新的类型对象的创建 ...

  4. 设计模式-抽象工厂模式的应用场景及Java中对抽象工厂的应用

    1. 什么是抽象工厂模式 抽象工厂模式提供了一个创建一系列相关或者相互依赖对象的接口,无需指定他们的类 抽象工厂模式(Abstract Factory Pattern)隶属于设计模式中的创建型模式,用 ...

  5. 常见设计模式—抽象工厂模式

    设计模式-抽象工厂模式 1.什么是抽象工厂模式 抽象工厂模式是围绕一个超级工厂创建其它工厂,是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品. 2.角色分 ...

  6. 【JAVA进阶系列】JAVA 设计模式 -- 抽象工厂模式(Abstract Factory)

    [JAVA进阶系列]JAVA 设计模式 -- 抽象工厂模式(Abstract Factory) [1.1]抽象工厂模式简介 抽象工厂者模式的类结构图 AbstractProduct(抽象产品),Abs ...

  7. 深入理解设计模式-抽象工厂模式

    文章目录 一.定义 二.使用场景 三.代码样例 1.需求 2.类图 3.实体类 4.产品类 5.工厂类 6.客户端 四.优缺点 结尾 一.定义 抽象工厂模式隶属于设计模式中的创建型模式,用于产品族的构 ...

  8. 徒手撸设计模式-抽象工厂模式

    概念 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. ...

  9. python:水果与设计模式-抽象工厂模式

    抽象工厂模式(Abstract Factory Pattern):属于创建型模式,它提供了一种创建对象的最佳方式.在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类,每个生成的 ...

最新文章

  1. 启明云端分享| SSD201 / SSD202D 在IP广播的应用
  2. Java面试中与源码有关的问题分享
  3. 经典C语言程序100例之十四
  4. 解决413 Request Entity Too Large
  5. 限时秒杀┃秒杀90%的玩具,让孩子爱上科学的彩虹实验2来了!
  6. python搭建项目结构_Django搭建项目实战与避坑细节详解
  7. 转自知乎-我见过最通俗易懂的KMP算法详解
  8. informatica 许可_Informatica安装教程
  9. 生产中k8s适合mysql_在K8S集群中构建复杂的MySQL单实例数据库
  10. mysql 查看autocommit_手把手教你分析Mysql死锁问题
  11. 前端发送的字符串有大小限制吗_前端经典面试题 30道
  12. 文件上传之multer
  13. 家庭备忘记事便签软件哪个实用?
  14. 浅谈幼儿园计算机论文,浅谈幼儿园科学教育活动中,计算机的辅助教学
  15. matlab输出正负号±
  16. 性能指标:队列深度、IOPS与时延
  17. 帆软 html页面,帆软报表-web页面集成
  18. Hi3559AV100/Hi3559CV100 DDR4参数配置说明
  19. Spring核心AOP(面向切面编程)总结
  20. Android实例 每日一句(英语)

热门文章

  1. 云天励飞人脸识别技术助力央视春晚会场安保 1
  2. 简单又好用的财务分析工具有哪些?
  3. 十.OpenCv 特征点检测和匹配
  4. 分类变量回归——Probit和Logit(附代码)
  5. spring 事务传播行为实例分析
  6. gitlab-ce搭建和数据迁移
  7. 新疆计算机信息管理专升本可以报哪些专业,专业介绍:新疆自学考试专业有哪些...
  8. 爱发4.2.8自动发卡去授权源码
  9. Tigress学习系列【2】(ImplicitFlow)
  10. Java项目-坦克大战(附源码+文档)