当前位置: 首页 > news >正文

设计模式-抽象工厂

         抽象工厂属于创建型模式。

         抽象工厂和工厂设计模式的区别:

        工厂模式的是设计模式中最简单的一种设计模式,主要设计思想是,分离对象的创建和使用,在Java中,如果需要使用一个对象时,需要new Class(),获取到对象,然后操作。而将创建对象这一过程集中管理就叫做工厂模式,在工厂模式下,你不需要创建目标对象,而是使用管理对象的工厂,去调用对象。

        抽象工厂负责创建一个相关对象的工厂,抽象工厂创建工厂,工厂再创建对象。

        工厂的上级抽象工厂

public abstract class AbstractFactory {public abstract Color getColor(String color);public abstract Shape getShape(String shape);
}

        普通工厂类,负责创建具体对象 

public class ShapeFactory extends AbstractFactory {@Overridepublic Color getColor(String color) {return null;}@Overridepublic Shape getShape(String shapeType) {if (shapeType == null) {return null;}if (shapeType.equalsIgnoreCase("CIRCLE")) {return new Circle();} else if (shapeType.equalsIgnoreCase("RECTANGLE")) {return new Rectangle();} else if (shapeType.equalsIgnoreCase("SQUARE")) {return new Square();}return null;}
}

        还需要一个类来根据条件创建不同的工厂,不同的工厂实现了抽象类,在这里就可以根据不同条件返回工厂对象,否则返回工厂对象的类需要写两个,因为两个工厂都实现了父类抽象工厂,返回对象可以返回父类

public class FactoryProducer {public static AbstractFactory getFactory(String choice){if(choice.equalsIgnoreCase("SHAPE")){return new ShapeFactory();} else if(choice.equalsIgnoreCase("COLOR")){return new ColorFactory();}return null;}
}

           在调用时,可以清晰的看到,首先获取工厂对象,再通过工厂对象来实现创建不同的对象

public static void main(String[] args) {//获取形状工厂AbstractFactory shapeFactory = FactoryProducer.getFactory("SHAPE");//获取形状为 Circle 的对象Shape shape1 = shapeFactory.getShape("CIRCLE");//调用 Circle 的 draw 方法shape1.draw();//获取形状为 Rectangle 的对象Shape shape2 = shapeFactory.getShape("RECTANGLE");//调用 Rectangle 的 draw 方法shape2.draw();//获取形状为 Square 的对象Shape shape3 = shapeFactory.getShape("SQUARE");//调用 Square 的 draw 方法shape3.draw();//获取颜色工厂AbstractFactory colorFactory = FactoryProducer.getFactory("COLOR");//获取颜色为 Red 的对象Color color1 = colorFactory.getColor("RED");//调用 Red 的 fill 方法color1.fill();//获取颜色为 Green 的对象Color color2 = colorFactory.getColor("GREEN");//调用 Green 的 fill 方法color2.fill();//获取颜色为 Blue 的对象Color color3 = colorFactory.getColor("BLUE");//调用 Blue 的 fill 方法color3.fill();}

 

        git地址:Design_pattern: 设计模式icon-default.png?t=N7T8https://gitee.com/qiminghaonan123/design_pattern.git

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Ansible的脚本-----playbook剧本【上】
  • org.springframework.context.annotation.ImportSelector的作用是什么?
  • 【数据结构】单链表面试题(Java + 力扣 + 详解)
  • Harmony Next -- 图片选择库:宫格展示、全屏预览
  • 生成对抗网络(Generative Adversarial Network,简称GAN
  • 3dsMax 设置近平面削减,靠近模型之后看不到模型,看很小的模型放大看不到
  • MySQL:增删改查、临时表、授权相关示例
  • 一个注解实现分布式锁加锁
  • RockyLinux 9 PXE Server bios+uefi 自动化部署 RockLinux 8 9
  • 数据库编程中游标 连接 commit
  • js——浅拷贝和深拷贝
  • 【Git多人协作开发】同一分支下的多人协作开发模式
  • springboot配置文件如何读取pom.xml的值
  • 新电脑如何设置 npm 源及查看源、安装 cnpm、pnpm 和 yarn 的详细教程
  • Python研究生毕业设计,数据挖掘、情感分析、机器学习
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • 【笔记】你不知道的JS读书笔记——Promise
  • 【附node操作实例】redis简明入门系列—字符串类型
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • Centos6.8 使用rpm安装mysql5.7
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • ES6核心特性
  • in typeof instanceof ===这些运算符有什么作用
  • Js基础知识(一) - 变量
  • JS实现简单的MVC模式开发小游戏
  • k8s如何管理Pod
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • SAP云平台里Global Account和Sub Account的关系
  • Zepto.js源码学习之二
  • 大型网站性能监测、分析与优化常见问题QA
  • 第十八天-企业应用架构模式-基本模式
  • 构建工具 - 收藏集 - 掘金
  • 记录:CentOS7.2配置LNMP环境记录
  • 聊聊flink的BlobWriter
  • 前端面试之闭包
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 使用 QuickBI 搭建酷炫可视化分析
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • # 利刃出鞘_Tomcat 核心原理解析(二)
  • #java学习笔记(面向对象)----(未完结)
  • (3)nginx 配置(nginx.conf)
  • (二十九)STL map容器(映射)与STL pair容器(值对)
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • *算法训练(leetcode)第四十五天 | 101. 孤岛的总面积、102. 沉没孤岛、103. 水流问题、104. 建造最大岛屿
  • .cfg\.dat\.mak(持续补充)
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景