概念

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

在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

参考链接: 抽象工厂模式 | 菜鸟教程

代码案例

公共类

枚举类

public final class StFlag {public StFlag() {}/*** 性别:0-男,1-女*/public static final String SEX_FLAG_0="0";public static final String SEX_FLAG_1="1";/*** 操作类型:A-新增,D-删除,U-更新*/public static final String OPTION_A="A";public static final String OPTION_D="D";public static final String OPTION_U="U";/*** 策略模式变量*/public static final String FEE_MODEL="feeModel_";/*** 汽车*/public static final String CAR="CAR";/*** 自行车*/public static final String BICYCLE="BICYCLE";/*** 火车*/public static final String TRAIN="TRAIN";/*** 黑色*/public static final String BLACK="BLACK";/*** 蓝色*/public static final String BLUE="BLUE";/*** 红色*/public static final String RED="RED";/*** 车子工厂*/public static final String CARS="CARS";/*** 刷漆工厂*/public static final String PAINTING="PAINTING";}

请求入参

@Data
public class RequestStudentModel implements Serializable {/*** 操作类型*/private String option;/*** id*/private Integer id;/*** 姓名*/private String name;/*** 年龄*/private Integer age;/*** 性别*/private String sex;/*** 身高*/private String height;/*** 爱好*/private String hobby;/*** 工厂类型*/private String factoryType;/*** 颜色集合*/private String[] colourTypeArr;/*** 车子集合*/private String[] carsTypeArr;
}

出参

/*** 响应结果类*/
@Data
@ToString
public class ResponseModel implements Serializable {//消息private String message;//状态码private int messageCode;//结果private Object result;public ResponseModel(String message, int messageCode, Object result) {this.message = message;this.messageCode = messageCode;this.result = result;}public ResponseModel() {}
}

创建两个接口

刷漆接口

/*** 刷漆接口*/
public interface BrushPainting {/*** 生产方法* @return*/String brush();
}

制造接口

/*** 制造接口*/
public interface CarsManufacture {/*** 生产方法* @return*/String product();
}

创建一个抽象工厂

/*** 抽象工厂*/
public abstract class AbstractFactory {/*** 制造车子* @param carType* @return*/public abstract CarsManufacture getManufacture(String carType);/*** 刷漆* @param caloreType* @return*/public abstract BrushPainting getBrushPainting(String caloreType);
}

创建三个喷漆实现类

刷红漆

@Slf4j
public class Red implements BrushPainting {/**** @return*/@Overridepublic String brush() {log.info("刷红漆");return "红漆";}
}

刷黑漆

@Slf4j
public class Black implements BrushPainting {/**** @return*/@Overridepublic String brush() {log.info("刷黑漆");return "黑漆";}
}

刷蓝漆

@Slf4j
public class Blue implements BrushPainting {/**** @return*/@Overridepublic String brush() {log.info("刷蓝漆");return "蓝漆";}
}

创建三个制造实现类

自行车

@Slf4j
public class Bicycle implements CarsManufacture {/*** 生产自行车*/@Overridepublic String product() {log.info("生产出一辆自行车");return "自行车";}
}

汽车

@Slf4j
public class Car implements CarsManufacture {/*** 生产汽车* @return*/@Overridepublic String product() {log.info("生产出一辆汽车");return "汽车";}
}

火车

@Slf4j
public class Train implements CarsManufacture {/*** 生产火车* @return*/@Overridepublic String product() {log.info("生产出一辆火车");return "火车";}
}

创建制造工厂-继承抽象工厂

/*** 制造工厂*/
@Slf4j
public class CarFactory extends AbstractFactory {/*** 制造车子* @param carType* @return*/@Overridepublic CarsManufacture getManufacture(String carType){if (StringUtils.isEmpty(carType)){return  null;}if (StFlag.CAR.equals(carType)){log.info("汽车制造厂");return new Car();}else if (StFlag.BICYCLE.equals(carType)){log.info("自行车制造厂");return new Bicycle();}else if (StFlag.TRAIN.equals(carType)){log.info("火车制造厂");return new Train();}return null;}/***  刷漆* @param caloreType* @return*/@Overridepublic BrushPainting getBrushPainting(String caloreType) {return null;}
}

创建喷漆工厂-继承抽象工厂

/*** 喷漆工厂*/
@Slf4j
public class PaintingFactory extends AbstractFactory{/*** 制造车子* @param carType* @return*/@Overridepublic CarsManufacture getManufacture(String carType) {return null;}/***  刷漆* @param caloreType* @return*/@Overridepublic BrushPainting getBrushPainting(String caloreType){if (StringUtils.isEmpty(caloreType)){return  null;}if (StFlag.RED.equals(caloreType)){log.info("红漆工厂");return new Red();}else if (StFlag.BLACK.equals(caloreType)){log.info("黑漆工厂");return new Black();}else if (StFlag.BLUE.equals(caloreType)){log.info("蓝漆工厂");return new Blue();}return null;}
}

创建工厂生产者

/*** 工厂生产者*/
public class FactoryProducr {public static AbstractFactory getFactory(String factoryType){if (factoryType.equals(StFlag.CARS)){return new CarFactory();}else if (factoryType.equals(StFlag.PAINTING)){return new PaintingFactory();}else {return null;}}
}

测试类

/*** 设计模式控制器*/
@RestController
@RequestMapping("/designPattern")
@Slf4j
public class DesignController {/*** 抽象工厂模式* @param studentEntity* @return*/@PostMapping("/abstractFactoryProduct")public  ResponseModel abstractFactoryProduct(@RequestBody RequestStudentModel studentEntity){String factoryType = studentEntity.getFactoryType();//获取车子集合String[] carsArr = studentEntity.getCarsTypeArr();//获取颜色集合String[] colourArr = studentEntity.getColourTypeArr();AbstractFactory abstractFactoryactory = FactoryProducr.getFactory(factoryType);if (StringUtils.isEmpty(factoryType) || null ==abstractFactoryactory){return new ResponseModel("请输入正确的工厂类型", 500, null);}List list = new ArrayList();//遍历生产车子if (!CollectionUtils.isEmpty(Arrays.asList(carsArr))){log.info("============开始生产车子================");for (String car : carsArr) {CarsManufacture manufacture = abstractFactoryactory.getManufacture(car);list.add(manufacture.product());}log.info("============生产车子完成================");}//遍历喷漆if (!CollectionUtils.isEmpty(Arrays.asList(colourArr))){log.info("============开始喷漆================");for (String colour : colourArr) {BrushPainting brushPainting = abstractFactoryactory.getBrushPainting(colour);list.add(brushPainting.brush());}log.info("============喷漆完成================");}return new ResponseModel("生产成功", 200, list);}
}

测试案例

创建车子工厂-生成车子

2022-06-15 23:25:46.155 INFO  ============开始生产车子================ 【http-nio-8081-exec-3】【DesignController:153】
2022-06-15 23:25:46.160 INFO  汽车制造厂 【http-nio-8081-exec-3】【CarFactory:25】
2022-06-15 23:25:46.160 INFO  生产出一辆汽车 【http-nio-8081-exec-3】【Car:14】
2022-06-15 23:25:46.161 INFO  自行车制造厂 【http-nio-8081-exec-3】【CarFactory:28】
2022-06-15 23:25:46.162 INFO  生产出一辆自行车 【http-nio-8081-exec-3】【Bicycle:14】
2022-06-15 23:25:46.164 INFO  火车制造厂 【http-nio-8081-exec-3】【CarFactory:31】
2022-06-15 23:25:46.164 INFO  生产出一辆火车 【http-nio-8081-exec-3】【Train:14】
2022-06-15 23:25:46.164 INFO  ============生产车子完成================ 【http-nio-8081-exec-3】【DesignController:158】

创建喷漆工厂-喷漆

2022-06-15 23:32:29.455 INFO  ============开始喷漆================ 【http-nio-8081-exec-8】【DesignController:163】
2022-06-15 23:32:29.455 INFO  红漆工厂 【http-nio-8081-exec-8】【PaintingFactory:35】
2022-06-15 23:32:29.456 INFO  刷红漆 【http-nio-8081-exec-8】【Red:14】
2022-06-15 23:32:29.456 INFO  黑漆工厂 【http-nio-8081-exec-8】【PaintingFactory:38】
2022-06-15 23:32:29.456 INFO  刷黑漆 【http-nio-8081-exec-8】【Black:14】
2022-06-15 23:32:29.456 INFO  蓝漆工厂 【http-nio-8081-exec-8】【PaintingFactory:41】
2022-06-15 23:32:29.456 INFO  刷蓝漆 【http-nio-8081-exec-8】【Blue:14】
2022-06-15 23:32:29.457 INFO  ============喷漆完成================ 【http-nio-8081-exec-8】【DesignController:168】

徒手撸设计模式-抽象工厂模式相关推荐

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

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

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

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

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

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

  4. java设计模式---抽象工厂模式

    工厂模式在项目中是常常用到的,有人说只有大项目才会用到,小项目是体会不出来.其实使用设计模式与项目的大小没有实质性的联系.设计模式是经验的总结而不是衡量项目大小的标准. 以开发项目的DAO层为例,在项 ...

  5. C++设计模式--抽象工厂模式

    前言 前面有两篇文章分别介绍了简单工厂模式和工厂方法模式,这两种模式都比较常见,今天介绍工厂模式的最后一种,抽象工厂模式. 抽象工厂模式(Abstract Factory Pattern)是所有形态的 ...

  6. python工厂模式 理解_浅谈Python设计模式 - 抽象工厂模式

    声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 在上一篇我们对工厂模式中的普通工厂模式有了一定的了解,其实抽象工作就是 表示针对 ...

  7. 05设计模式——抽象工厂模式

    前言:以下总结来自龙哥---左潇龙博客. 总结的很到位,附上博客链接:http://www.cnblogs.com/zuoxiaolong/p/pattern6.html 抽象工厂模式算是工厂相关模式 ...

  8. [设计模式] ------ 抽象工厂模式

    抽象工厂模式 抽象工厂模式,就是对工厂方法模式加以改进而已,其实就是用简单工厂模式的套路创建各个工厂,后面和工厂模式就一模一样了. 其实就是相当于将创建哪个工厂的权利再次放给调用端. 调用端在调用的时 ...

  9. C++设计模式-抽象工厂模式

    目录 基本概念 代码与实例 基本概念 抽象工厂模式(Abstract Factory),提供一个创建一系列相关或相互依赖对象的接口,从而无需指定他们具体的类. 抽象工厂的好处: 1. 易于交换产品系列 ...

最新文章

  1. Maven入门指南⑦:Maven的生命周期和插件
  2. 根据c语言数组定义填写下表,C语言程序设计 自测题(三)
  3. 创建Student Course SC表
  4. Postman接口调试神器-Chrome浏览器插件
  5. 杭州内推 | 阿里云开发者社区招聘计算机视觉算法工程师(2022年毕业生)
  6. druid监控配置及sql注入防火墙配置
  7. Python 中的range,以及numpy包中的arange函数
  8. windows下python3用pip安装kivy和kivy示例
  9. python 常用字符串 列表元祖字典都 自带的函数方法
  10. c#利用反射Assembly 对类和成员属性进行操作
  11. java 如何执行dig 命令_dig命令简介
  12. 《操作系统实验》C++实现时间片轮转调度算法
  13. 关于网站被挂马的症状以及处理解决方法
  14. python 协程加多线程下载asyncio、ThreadPoolExecutor
  15. 中国兰花怎么养 中国兰花养殖方法及注意事项
  16. 【每日蓝桥】8、一三年省赛Java组真题“打印十字图”
  17. 带你了解IT互联网行业程序员岗位有些什么类型?
  18. MASM32编程完善SysInfo遇到奇怪故障,真切感受全局变量和局部变量之别……
  19. Java的GUI编程---贪吃蛇游戏实现
  20. NFT跟元宇宙有什么关系?

热门文章

  1. 浅谈UML---类图
  2. vue cli4使用axios(通过RAP2生成后端接口)
  3. 《Rethinking Efficient Lane Detection via Curve Modeling》论文笔记
  4. 【以太网硬件七】扰码和mBnB有什么区别和相同点?
  5. matlab赌徒输完问题,Gambler's Ruin(赌徒破产问题 概率论)
  6. 技术男眼中的“TD式创新”:陈年旧账应该这么算
  7. (转)第三十七节、人脸检测MTCNN和人脸识别Facenet(附源码)
  8. HashMap的工作原理(一):Hash算法
  9. C++异常 和 SEH异常 的一点小结
  10. 肉鸡的俘虏!一个菜鸟木马黑客的自白