抽象工厂模式设计模式_创新设计模式:抽象工厂模式

抽象工厂模式设计模式

抽象工厂模式是一种创新模式,是与构建器和工厂模式一起最受欢迎的模式之一。 使用创建模式是为了创建对象,而不是直接使用构造函数创建对象。

抽象工厂模式提供了一种封装一组具有共同主题的单个工厂而无需指定其具体类的方法。

采用该模式的目的是使对象的创建与它们的用法隔离开来,并创建相关对象的族,而不必依赖于它们的具体类。

通过使用该模式,客户端不必知道对象及其实现细节。 抽象工厂的实现有责任实现对象并处理所有细节,以便成功地做到这一点。

因此,让我们开始行动,开始解决问题。
假设我们负责各种产品的罐装过程。
关于罐装过程,必须创建两个对象。 罐的主体和罐的顶部。 同时考虑到我们可能具有各种罐头形式的事实,我们可能也拥有可以处理罐头过程的各种工厂。 例如,我们可能有一家啤酒罐头工厂或一家食品罐头工厂。

关于上面的描述,似乎抽象工厂是路要走。 我们确实有一系列对象,并且确实想隐藏这些对象的构造。

我们将从添加两个有关罐顶和罐体功能的接口开始。

package com.gkatzioura.design.creational.abstractfactory;public interface CanTop {void open();}
package com.gkatzioura.design.creational.abstractfactory;public interface CanBody {void fill();}

然后,我们将创建一个抽象工厂,该工厂将提供实现这些对象的方法。

package com.gkatzioura.design.creational.abstractfactory;public abstract class CanningFactory {public abstract CanTop createTop();public abstract CanBody createBody();}

如前所述,我们有啤酒罐的情况。 因此,我们将实现CanTop和CanBody类的实现。

package com.gkatzioura.design.creational.abstractfactory.beer;import com.gkatzioura.design.creational.abstractfactory.CanTop;public class BeerCanTop implements CanTop {public void open() {}
}
package com.gkatzioura.design.creational.abstractfactory.beer;import com.gkatzioura.design.creational.abstractfactory.CanBody;public class BeerCanBody implements CanBody {public void fill() {}
}

然后,我们将建立一个啤酒罐头工厂。

package com.gkatzioura.design.creational.abstractfactory.beer;import com.gkatzioura.design.creational.abstractfactory.CanBody;
import com.gkatzioura.design.creational.abstractfactory.CanTop;
import com.gkatzioura.design.creational.abstractfactory.CanningFactory;public class BeerCanningFactory extends CanningFactory {public CanTop createTop() {return new BeerCanTop();}public CanBody createBody() {return new BeerCanBody();}}

另一种情况是食品罐头。 在这种情况下,我们还将提供CanTop和CanBody类的实现。

package com.gkatzioura.design.creational.abstractfactory.food;import com.gkatzioura.design.creational.abstractfactory.CanBody;public class FoodCanBody implements CanBody {public void fill() {}
}
package com.gkatzioura.design.creational.abstractfactory.food;import com.gkatzioura.design.creational.abstractfactory.CanTop;public class FoodCanTop implements CanTop {public void open() {}
}

作为最后一步,我们将为食品罐头提供抽象的工厂实现。

package com.gkatzioura.design.creational.abstractfactory.food;import com.gkatzioura.design.creational.abstractfactory.CanBody;
import com.gkatzioura.design.creational.abstractfactory.CanTop;
import com.gkatzioura.design.creational.abstractfactory.CanningFactory;public class FoodCanningFactory extends CanningFactory {public CanTop createTop() {return new FoodCanTop();}public CanBody createBody() {return new FoodCanBody();}}

我们刚才所做的是使用抽象工厂模式来创建有关装罐过程的一系列对象。 我们将创建过程与CanTop和CanBody的使用隔离开来。 同样,我们能够创建一系列对象,而无需依赖于它们的具体类。

您可以在github上找到源代码。

在下一篇博客文章中,我们将了解工厂模式。

另外,我还编写了备忘单,其中包含“创作设计模式”的摘要。
在链接中注册以接收它。

翻译自: https://www.javacodegeeks.com/2018/03/creational-design-patterns-abstract-factory-pattern.html

抽象工厂模式设计模式

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

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

相关文章

dubbo protocol port 消费者端_Dubbo源码:搞定URL,就走完了进度条的一半

Dubbo 中的 URL大家都知道,在互联网领域,每个信息资源都有统一的且在网上唯一的地址,该地址就叫 URL(Uniform Resource Locator,统一资源定位符),它是互联网的统一资源定位标志,也就…

swarm 容器_Oracle应用容器云上的WildFly Swarm

swarm 容器在此博客文章中,我将描述如何将打包在WildFly Swarmber -jar中的CloudEE Duke应用程序部署到Oracle Application Container Cloud 。 在Oracle Application Container Cloud中进行部署所需的部署工件是一个ZIP归档文件,其中包含应用程序ber-j…

mysql数据库文件还原数据库_MySql通过数据库文件恢复数据库

以表”Table”为例:如类型是MyISAM, 数据文件则以”Table.frm””Table.MYD””Table.MYI””三个文件存储于”/data/$databasename/”目录中.如类型是InnoDB, 数据文件则存储在”$innodb_data_home_dir/″中的ibdata1文件中(一般情况),结构文件存在于table_name.fr…

yum 如何知道从哪里下载包?

包来自什么地方呢?yum 如何知道从哪里下载包?起点是 /etc/yum.repos.d/ 目录,这个目录常常包含几个 repo 文件。这是 repo 的默认位置,但是可以在 YUM 配置文件(通常是 /etc/yum.conf)中指定其他位置。清单…

mysql主从修改系统参数步骤_mysql主从配置的参数配置与步骤_MySQL

mysql主从配置的参数配置与步骤_MySQL主从配置的步骤:在主库建立要同步的数据库,建立主库的帐号和修改主备库配置create database web default character set utf8grant replication slave on *.* to repdcssub192.168.191.112 identified by 123456;grant all priv…

javascript 解密_Javascript中的AES加密和Java中的解密

javascript 解密AES代表高级加密系统,它是一种对称加密算法,很多时候我们需要在客户端加密一些纯文本,例如密码,然后将其发送到服务器,然后由服务器解密以进行进一步处理.AES加密和解密更加容易在相同的平台&#xff0…

英文标点符号大全

标点符号英文中文名称未知反撇号’apostrophe撇号,缩写及所有格符号plus加号;正号-minus减号;负号plus or minus正负号is multiplied by乘号is divided by除号=is equal to等于号≠is not equal to不等于号≡is equivalent to全等…

Linux 系统下显示文件内容(查看文件内容)的命令 more/less/cat/head/tail 比较

命令说明more建议用于查看内容较长的文本文件,内容可以分屏显示,并且支持在显示时定位关键字cat建议用于查看内容较少的文本文件。当文件较大时,文本在屏幕上迅速闪过(滚屏),用户往往看不清所显示的内容。因…

mysql子分区多少层_MySQL 子分区-阿里云开发者社区

介绍子分区其实是对每个分区表的每个分区进行再次分隔,目前只有RANGE和LIST分区的表可以再进行子分区,子分区只能是HASH或者KEY分区。子分区可以将原本的数据进行再次的分区划分。一、创建子分区子分区由两种创建方法,一种是不定义每个子分区…

gradle 编译java_Java的Gradle依赖关系,使用编译还是实现?

gradle 编译java当我向一位同事解释如何将Gradle用于Java项目时(他正在远离Maven ),我们遇到了各种代码示例。 一些示例将编译配置用于依赖项,而其他示例则使用Implements和api 。 dependencies { compile commons-httpclient:co…

Linux 命令之 typeset -- 声明 shell 变量,设置变量的属性

文章目录一、命令介绍二、常用选项三、命令示例(1)定义关联数组并访问一、命令介绍 typeset 命令是 bash 的内建命令,是命令 declare 的别名,两者是完全一样的,用来声明 shell 变量,设置变量的属性。 用于…

git log 迁移_现场故事:从Log4J迁移到Log4J2

git log 迁移通过从您的应用程序学习企业APM产品,发现更快,更有效的性能监控。 参加AppDynamics APM导览! 与许多Java应用程序一样,AppDynamics Java代理广泛使用日志记录。 多年来,我们一直使用Log4J作为我们的日志记…

mysql firebird 性能_Firebird, MySQL 与 PostgreSQL 代码质量对比

今天看到一篇文章 - “Firebird, MySQL 与 PostgreSQL 代码质量对比”- 关于三个开源 RDBMS 的静态分析比较。主要内容A few words about the projectsFirebirdMySQLPostgreSQLPVS-StudioComparison criteriaWhy "head-on" comparison is not a good ideaAn alterna…

Linux 命令之 let -- bash 中用于计算的工具,用于执行一个或多个表达式

文章目录一、命令介绍二、命令示例自增操作自减操作shell 脚本中的运算表达式一、命令介绍 let 命令是 BASH 中用于计算的工具,用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量。如果表达式中包含了空格或其他特殊字符,则必须引…

sun jdk 与jdk_Sun过去的世界中的JDK 11和代理

sun jdk 与jdk使用JDK 11后,就sun.misc.Unsafe的第一种方法。 其中, defineClass方法已删除。 代码生成框架通常使用此方法在现有的类加载器中定义新的类。 尽管此方法易于使用,但它的存在也使JVM本质上不安全,正如其定义类的名称…

php mysql上传多张图片_PHP开发之多个文件上传到MySql数据库(一)

前面的章节我们介绍了用PHP实现上传一个文件的教程。朋友们就会有疑问,怎么样才能上传多张多个文件到数据库?重点在于放入几个文件以后点击提交上传之后所有的文件一起上传,并且每个文件都给一个新的路径。提供一种思路:先获取每个…

jdk只有一个java进程_JDK 10:从Java访问Java应用程序的进程ID

jdk只有一个java进程StackOverflow.com上一个普遍的问题是:“ Java程序如何获得自己的进程ID? 与该问题相关的几个答案包括解析ManagementFactory返回的String 。 getRuntimeMXBean() 。 getName() [但是可…

Shell 脚本生成不重复的随机数

#!/bin/bash #AUTHOR:AN #DATE:2019-3-24 #Describe:Generate No-Repeat Random-Number #Method:如生成3~7的随机数,先生成0~4(7-3)的随机数,再加上3(起始值)来修正 #####################################…

python if语句能否判断中文_Python“if”语句被忽略

如果满足多个条件(“or”)中的一个,我将触发Python中的循环。脚本似乎跳过了“if”语句并在不满足所需条件的情况下进入内部循环。在编码# Begin TestCase# Main logic: execute RemoteController macro, if expected state true, set Success, else: Failfor macr…