创建型设计模式——抽象工厂模式
1.什么是抽象工厂模式?
- 抽象工厂模式: 定义了一个interface用于创建相关或有依赖关系的对象簇,而无需指明具体的类。
- 抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合。
- 从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或者称为进一步的抽象)。
- 将工厂抽象成两层,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.工厂方法 + 抽象工厂总结
- 工厂模式的意义:将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖关系的解耦。从而提高项目的扩展和维护性。
- 遵循了依赖倒转原则:创建对象实例时,不要直接new类,而是把这个new类的动作放在一个工厂的方法中,并返回。有的书上说,变量不要直接持有具体类的引用。 不要让类继承具体类,而是继承抽象类或者是实现interface(接口)不要覆盖基类中已经实现的方法。
创建型设计模式——抽象工厂模式相关推荐
- 每天学习一个设计模式(八):创建型之抽象工厂模式
目录 一.基本概念 二.通俗解释 三.应用场景 1.使用简单工厂模式的解决方案 2.抽象工厂模式 抽象工厂模式结构 在什么情况下应当使用抽象工厂模式 抽象工厂模式的起源 四.抽象工厂模式的优缺点 抽象 ...
- 创建型设计模式之工厂模式
文章目录 一.工厂设计模式 二.工厂设计模式详解 1.简单工厂模式 2. 工厂方法模式 3. 抽象工厂模式 总结 一.工厂设计模式 工厂模式就类比实际生活中的工厂,在实际生活中,用户从来不会关系一个物 ...
- 系统架构技能之设计模式-抽象工厂模式
一.上篇回顾 上篇我们主要讲述了简单工厂模式和工厂模式.并且分析了每种模式的应用场景和一些优缺点,我们现在来回顾一下: 简单工厂模式:一个工厂负责所有类型对象的创建,不支持无缝的新增新的类型对象的创建 ...
- 设计模式-抽象工厂模式的应用场景及Java中对抽象工厂的应用
1. 什么是抽象工厂模式 抽象工厂模式提供了一个创建一系列相关或者相互依赖对象的接口,无需指定他们的类 抽象工厂模式(Abstract Factory Pattern)隶属于设计模式中的创建型模式,用 ...
- 常见设计模式—抽象工厂模式
设计模式-抽象工厂模式 1.什么是抽象工厂模式 抽象工厂模式是围绕一个超级工厂创建其它工厂,是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品. 2.角色分 ...
- 【JAVA进阶系列】JAVA 设计模式 -- 抽象工厂模式(Abstract Factory)
[JAVA进阶系列]JAVA 设计模式 -- 抽象工厂模式(Abstract Factory) [1.1]抽象工厂模式简介 抽象工厂者模式的类结构图 AbstractProduct(抽象产品),Abs ...
- 深入理解设计模式-抽象工厂模式
文章目录 一.定义 二.使用场景 三.代码样例 1.需求 2.类图 3.实体类 4.产品类 5.工厂类 6.客户端 四.优缺点 结尾 一.定义 抽象工厂模式隶属于设计模式中的创建型模式,用于产品族的构 ...
- 徒手撸设计模式-抽象工厂模式
概念 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. ...
- python:水果与设计模式-抽象工厂模式
抽象工厂模式(Abstract Factory Pattern):属于创建型模式,它提供了一种创建对象的最佳方式.在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类,每个生成的 ...
最新文章
- 启明云端分享| SSD201 / SSD202D 在IP广播的应用
- Java面试中与源码有关的问题分享
- 经典C语言程序100例之十四
- 解决413 Request Entity Too Large
- 限时秒杀┃秒杀90%的玩具,让孩子爱上科学的彩虹实验2来了!
- python搭建项目结构_Django搭建项目实战与避坑细节详解
- 转自知乎-我见过最通俗易懂的KMP算法详解
- informatica 许可_Informatica安装教程
- 生产中k8s适合mysql_在K8S集群中构建复杂的MySQL单实例数据库
- mysql 查看autocommit_手把手教你分析Mysql死锁问题
- 前端发送的字符串有大小限制吗_前端经典面试题 30道
- 文件上传之multer
- 家庭备忘记事便签软件哪个实用?
- 浅谈幼儿园计算机论文,浅谈幼儿园科学教育活动中,计算机的辅助教学
- matlab输出正负号±
- 性能指标:队列深度、IOPS与时延
- 帆软 html页面,帆软报表-web页面集成
- Hi3559AV100/Hi3559CV100 DDR4参数配置说明
- Spring核心AOP(面向切面编程)总结
- Android实例 每日一句(英语)