创建型模式-抽象工厂模式

在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
抽象工厂模式提供了一种创建一系列相关或相互依赖对象的接口,而无需指定具体实现类。通过使用抽象工厂模式,可以将客户端与具体产品的创建过程解耦,使得客户端可以通过工厂接口来创建一族产品。

意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
主要解决:主要解决接口选择的问题。
何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
如何解决:在一个产品族里面,定义多个产品。

public interface Shape {void draw();
}public class Circle implements Shape{@Overridepublic void draw() {System.out.println("this is Circle");}
}public class Rectangle implements Shape{@Overridepublic void draw() {System.out.println("this is Rectangle");}
}public class Square implements Shape {@Overridepublic void draw() {System.out.println("this is Square");}
}
public interface Color {void fill();
}public class Blue implements Color{@Overridepublic void fill() {System.out.println("this is blue");}
}public class Green implements Color{@Overridepublic void fill() {System.out.println("this is green");}
}public class Red implements Color{@Overridepublic void fill() {System.out.println("this is red");}
}
public  abstract class AbstractFactory {public abstract Color getColor(String color);public abstract Shape getShape(String shape);
}
public class ColorFactory extends AbstractFactory{@Overridepublic Color getColor(String color) {if(color == null){return null;}if(color.equalsIgnoreCase("RED")){return new Red();} else if(color.equalsIgnoreCase("GREEN")){return new Green();} else if(color.equalsIgnoreCase("BLUE")){return new Blue();}return null;}@Overridepublic Shape getShape(String shape) {return null;}
}
public class ShapeFactory extends AbstractFactory{@Overridepublic Color getColor(String color) {return null;}public Shape getShape(String shapeType){if (shapeType == null){return null;}if (shapeType.equalsIgnoreCase("CIRCLE")){return new Circle();}if (shapeType.equalsIgnoreCase("RECTANGLE")){return new Rectangle();}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;}
}
   @Testpublic void test7(){AbstractFactory shapeFactory = FactoryProducer.getFactory("SHAPE");Shape shape1 = shapeFactory.getShape("CIRCLE");shape1.draw();Shape shape2 = shapeFactory.getShape("RECTANGLE");shape2.draw();Shape shape3 = shapeFactory.getShape("SQUARE");shape3.draw();AbstractFactory colorFactory = FactoryProducer.getFactory("COLOR");Color color1 = colorFactory.getColor("RED");color1.fill();Color color2 = colorFactory.getColor("GREEN");color2.fill();Color color3 = colorFactory.getColor("BLUE");color3.fill();}
/**
this is Circle
this is Rectangle
this is Square
this is red
this is green
this is blue
**/

工厂模式和抽象工厂模式有什么区别

  • 工厂模式是创建单个类型的对象的工厂,而抽象工厂是创建不同但相关或依赖对象的工厂。
  • 工厂模式是一个(单个)方法,而抽象工厂模式是一个对象。
  • 工厂模式创建一个对象,而抽象工厂创建一系列相关的对象。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/50258.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Pytest和Unittest测试框架的区别?

如何区分这两者,很简单unittest作为官方的测试框架,在测试方面更加基础,并且可以再次基础上进行二次开发,同时在用法上格式会更加复杂;而pytest框架作为第三方框架,方便的地方就在于使用更加灵活&#xff0…

C#使用自定义的比较器对版本号(编码)字符串进行排序

给定一些数据,如下所示: “1.10.1.1.1.2”, “1.1”, “2.2”, “1.1.1.1”, “1.1.3.1”, “1.1.1”, “2.10.1.1.1”, “1.1.2.1”, “1.2.1.1”, “2.5.1.1”, “1.10.1.1”, “1.10.2.1”, “1.11.3.1”, “1.11.12.1”, “1.11.11.1”, “1.11.3.1”, “1”, “…

Matlab进阶绘图第26期—双向堆叠图

双向堆叠图是一种特殊的堆叠图,其通过在两个方向构建堆叠图,从而可以对两种类别的同名及综合属性进行全方位的比较。 由于Matlab中未收录双向堆叠图的绘制函数,因此需要大家自行设法解决。 本文分享一个简单的双向堆叠图的绘制方法&#xf…

SMC状态机 创建SMC.sm文件

XX.sm 文件是一个没有定义状态或转换的框架。包含以下特性: 使用%{ %}进行注释。 关键字讲解: 关键字 作用%package指定此FSM所属的类包,与关联的Task类包相同。%fsmclass指定生成…

java中把一个list转tree的方法

环境 我们有个需求,数据库要存一个无限级联的tree,比如菜单,目录,或者地区等数据,现有两个问题: 问如何设计表。怎么返回给前端一个无线级联的json数据。 思考 第一个问题 在设计表的时候,…

矩阵与图的关系:矩阵是图,图是矩阵

原文连接 线性代数最被低估的一个事实:矩阵是图,图是矩阵。 将矩阵编码为图是一种取巧的行为(cheat code),它其使复杂的行为变得易于研究。 让我告诉你怎么做! 1. 非负矩阵的有向图 (The directed graph of a nonne…

验证码识别DLL ,滑块识别SDK,OCR图片转文字,机器视觉找物品

验证码识别DLL ,滑块识别SDK 你们用过哪些OCR提取文字,识图DLL,比如Opencv,Labview机器视觉找物品之类?

高等数学之洛必达法则

第二种 由小到大 其他形式 解题步骤 分子分母的式子是乘积的时候可以用等价无穷小替换,如果是-则不允许

数据分析实战│时间序列预测

时间序列预测问题是一类常见的数据分析问题。数据中往往包含时间标签,这类问题往往根据过去一段时间的数据,建立能够比较精确地反映序列中所包含的动态依存关系的数学模型,并对未来的数据进行预测。 01、问题描述及数据挖掘目标 本案例给出二战时期的某气象站温度记录值,通…

Golang Gorm 高级查询之where查询

插入测试数据 package mainimport ("fmt""gorm.io/driver/mysql""gorm.io/gorm" )type Student struct {ID int64Name string gorm:"size:6"Age intEmail *string }func (*Student) TableName() string {return "student&q…

ChatGPT帮助提升工作效率和质量:完成时间下降40%,质量评分上升 18%

自ChatGPT去年11月发布以来,人们就开始使用它来协助工作,热心的用户利用它帮助撰写各种内容,从宣传材料到沟通话术再到调研报告。 两名MIT经济学研究生近日在《科学》杂志上发表的一项新研究表明,ChatGPT可能有助于减少员工之…

ModuleNotFoundError: No module named ‘matlab.engine‘; ‘matlab‘ is not a package

问题原因及解决方法:程序文件命名为matlab导致了冲突,改变代码文件名称即可https://ww2.mathworks.cn/matlabcentral/answers/362824-no-module-named-matlab-engine-matlab-is-not-a-package

RedisTemplate和StringRedisTemplate的区别、对比

学习 Jedis、RedisTemplate、StringRedisTemplate之间的比较 博客中提到:一. Jedis是Redis官方推荐的面向Java的操作Redis的客户端。 二. RedisTemplate,StringRedisTemplate是SpringDataRedis中对JedisApi的高度封装。SpringDataRedis相对于Jedis来说可以方便地更…

maven工程的目录结构

https://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html maven工程的目录结构: 在maven工程的根目录下面,是pom.xml文件。此外,还有README.txt、LICENSE.txt等文本文件,便于用户能够…

【GeoDa实用技巧100例】024:geoda计算全局(局部)莫兰指数Moran‘s I,LISA聚类地图,显著性地图

严重声明:本文及专栏《GeoDa空间计量案例教程100例》为CSDN博客专家刘一哥GIS原创,原文及专栏地址为:https://blog.csdn.net/lucky51222/category_12373659.html,谢绝转载或爬取!!! 文章目录 一、计算全局(或局部)单变量莫兰指数I1. 加载实验数据2. 加载权重矩阵3. 创建…

精密图纸被窃,知名手表品牌Seiko遭BlackCat勒索软件攻击

据BleepingComputer消息,日本著名手表制造商Seiko在7月末遭到了网络攻击,8月21日,BlackCat(又名ALPHV)勒索软件组织在其网站上宣布对这起攻击事件负责。 8 月 10 日,Seiko发布了一份数据泄露通知&#xff0…

IPv4,IPv6,TCP,路由

主要回顾一下TCP/IP的传输过程,在这个过程中,做了什么事情 ip : 网际协议,IP协议能让世界上任意两台计算机之间进行通信。 IP协议的三大功能: 寻址和路由传递服务:不可靠(尽最大努力交付传输数据包&…

基于ssm校园快递代取系统源码和论文

基于ssm校园快递代取系统源码和论文056 开发工具:idea 数据库mysql5.7 数据库链接工具:navcat,小海豚等 技术:ssm 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,…

matlab实现输出的几种方式(disp函数、fprintf函数、print函数)

matlab实现输出的几种方式(disp函数、fprintf函数、print函数) 输出为文本、文件、打印 1、disp函数 显示变量的值,如果变量包含空数组,则会返回 disp,但不显示任何内容。 矩阵 A [1 0]; disp(A)结果 字符串 S …

「UG/NX」Block UI 选择特征SelectFeature

✨博客主页何曾参静谧的博客📌文章专栏「UG/NX」BlockUI集合📚全部专栏「UG/NX」NX二次开发「UG/NX」BlockUI集合「VS」Visual Studio「QT」QT5程序设计「C/C+&#