抽象工厂模式设计模式_21世纪的设计模式:抽象工厂模式

抽象工厂模式设计模式

这是我的演讲的第二部分,“ 21世纪的设计模式” 。

此模式在Java代码中到处都有使用,尤其是在更多“企业”代码库中。 它涉及一个接口和一个实现。 该界面如下所示:

public interface Bakery {Pastry bakePastry(Topping topping);Cake bakeCake();
}

并执行:

public class DanishBakery implements Bakery {@Override public Pastry bakePastry(Topping topping) {return new DanishPastry(topping);}@Override public Cake bakeCake() {return new Aeblekage(); // mmmm, apple cake...}
}

更一般而言,抽象工厂模式通常是根据此结构实现的。

抽象工厂模式uml

在此示例中, PastryCake是“抽象产品”,而Bakery是“抽象工厂”。 它们的实现是具体的变体。

现在,这是一个相当普通的示例。

实际上,大多数工厂只有一种“创建”方法。

@FunctionalInterface
public interface Bakery {Pastry bakePastry(Topping topping);
}

哦,看,这是一个功能。

这种轻率的情况在“抽象工厂”模式以及许多其他模式中非常普遍。 尽管它们大多数都提供了许多离散的功能,并提供了许多方法,但是出于灵活性的考虑,或者由于我们只需要一件事情,我们经常倾向于将它们分解为单方法类型。时间。

那么我们将如何实现这种糕点制造商呢?

public class DanishBakery implements Bakery {@Override public Pastry apply(Topping topping) {return new DanishPastry(Topping topping);}
}

好的,那很容易。 它看起来像早期的DanishBakery但不能做蛋糕。 美味的苹果蛋糕……有什么意义?

好吧,如果您还记得的话, Bakery有一种单一的抽象方法 。 这意味着它是一个功能接口

那么,此功能等效于什么?

Bakery danishBakery = topping -> new DanishPastry(topping);

甚至:

Bakery danishBakery = DanishPastry::new;

瞧 我们的DanishBakery课程已经结束。

但是我们可以走得更远。

package java.util.function;
/*** Represents a function that* accepts one argument and produces a result.** @since 1.8*/
@FunctionalInterface
public interface Function<T, R> {/*** Applies this function to the given argument.*/R apply(T t);...
}

我们可以用Function<Topping, Pastry>代替Bakery ; 它们具有相同的类型。

Function<Topping, Pastry> danishBakery = DanishPastry::new;

在这种情况下,我们可能要保留它,因为它的名称与我们的业务相关,但是通常,类似Factory的对象没有真正的领域用途,只能帮助我们解耦代码。 ( UserServiceFactory ,有人吗?)这很棒,但是在这些情况下,我们不需要显式的类-Java 8内置了一堆接口,例如FunctionSupplierjava.util.function更多接口。包装,非常适合我们的需求。

这是我们更新的UML图:

抽象工厂模式功能

aa 好多了。

翻译自: https://www.javacodegeeks.com/2015/04/design-patterns-in-the-21st-century-the-abstract-factory-pattern.html

抽象工厂模式设计模式

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

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

相关文章

对 C 语言指针最详尽的讲解

点击蓝字关注我们指针对于C来说太重要。然而&#xff0c;想要全面理解指针&#xff0c;除了要对C语言有熟练的掌握外&#xff0c;还要有计算机硬件以及操作系统等方方面面的基本知识。所以本文尽可能的通过一篇文章完全讲解指针。为什么需要指针&#xff1f;指针解决了一些编程…

app http routes.php,Laravel:我的应用程序没有被路由(Laravel : My app doesn't get routed)

Laravel&#xff1a;我的应用程序没有被路由(Laravel : My app doesnt get routed)我正在运行我的第一个laravel应用程序&#xff0c;在接下来的几个小时中遇到依赖项安装错误。对不起它可能是一个小错误&#xff0c;但似乎我无法找到。图片较暗&#xff0c;电脑坏了。应用程序…

ssm 返回json配置_摆脱困境:将运行时配置作为JSON返回

ssm 返回json配置如果需要确定部署到远程服务器的Spring Web应用程序的运行时配置&#xff0c;则需要读取从远程服务器找到的属性文件。 这很麻烦。 幸运的是&#xff0c;有更好的方法。 这篇博客文章描述了我们如何 启动我们的Web应用程序时&#xff0c;将运行时配置写入日志…

为什么 Android 必须在主线程更新 UI ?

点击蓝字关注我们为什么Android必须在主线程更新UI&#xff1f;站在各位大牛的肩膀上&#xff0c;谢谢&#xff01;正常情况下&#xff0c;Android需要在UI线程更新UI&#xff0c;然鹅&#xff0c;在特殊情况下&#xff0c;子线程也能更新UI不在讨论之列&#xff0c;这篇文章主…

如何对linux文件进行编译,Linux下将源文件编译成目标文件的过程解析

简介请讲一下linux如何源文件逐步编译成可执行文件。解答首先先上图对编译的整个过程有个感性的认识&#xff0c;然后再逐步分析各个过程。以hello.c 程序为例# include main{printf("hello\n");}一个.c源程序需要经过预处理器生成.i文件&#xff0c;再经过编译器生成…

eclipse m2e配置_使用此首选项可加快Eclipse m2e配置

eclipse m2e配置谁不认识他们。 Eclipse中的旧式JFace对话框可以使您直观地看到实际上是一个相当简单的XML或属性文件。 对于m2e&#xff0c;它看起来像这样&#xff1a; 不幸的是&#xff0c;此屏幕的加载速度有点慢&#xff0c;除了检查版本号和其他您将永远不会更改的东西…

学点 STL C++ 的线性容器

点击蓝字关注我们std::array看到这个容器的时候肯定会出现这样的问题&#xff1a;为什么要引入 std::array 而不是直接使用 std::vector&#xff1f;已经有了传统数组&#xff0c;为什么要用 std::array?先回答第一个问题&#xff0c;与 std::vector 不同&#xff0c;std::arr…

linux at查看进程命令,at命令 - Linux命令大全 | linux教程

at命令允许指定运行脚本时间&#xff0c;at的守护进程atd会以后台模式运行&#xff0c;检查系统上的一个特殊目录来获取at命令的提交的作业。默认情况下&#xff0c;atd守护进程每60秒检查一次目录。有作业时会检查作业运行时间&#xff0c;如果与当前时间匹配&#xff0c;则运…

java替换数组中的元素_如何使用Java 8流快速替换列表中的元素

java替换数组中的元素假设您有一个项目清单&#xff1a; List<String> books Arrays.asList("The Holy Cow: The Bovine Testament","True Hip Hop","Truth and Existence","The Big Book of Green Design" );&#xff08;不要…

C++:良好的编程习惯与编程要点

点击蓝字关注我们以良好的方式编写C class假设现在我们要实现一个复数类complex&#xff0c;在类的实现过程中探索良好的编程习惯。① Header(头文件)中的防卫式声明complex.h: # ifndef __COMPLEX__ # define __COMPLEX__ class complex {} # endif防止头文件的内容被多次包含…

如何使用man命令linux,Linux man命令的使用方法

Linux提供了丰富的帮助手册&#xff0c;当你需要查看某个命令的参数时不必到处上网查找&#xff0c;只要man一下即可。可以使用man man 查看man的使用方法1.man共有以下几个章节代码功能1标准用户命令(Executable programs or shell commands)2系统调用(System calls)functions…

linux adb 端口,linux 无法连接adb 设备

之前电脑linux 连接 adb 设备一直都是正常的&#xff0c;今天突然出现无法连接的情况adb shell出现下面的错误信息error: insufficient permissions for deviceadb device出现下面的信息List of devices attached????????????no permissions解决方法lsusb 查看adb…

php 系统交互 删除文件_FileSystemMap:与文件系统交互的自然方法

php 系统交互 删除文件作为项目的一部分&#xff0c;我目前正在研究创建FileSystemMap 。 我已经开始了一个非常小的GitHub的项目在这里举办的代码。 本质上&#xff0c;此映射实现将允许用户与其文件系统上的目录进行交互&#xff0c;就好像它是java.util.Map 。 映射中的每个…

又要卷?挑战 C 语言,新的系统编程语言 Hare 发布

点击蓝字关注我们开发者 Drew DeVault 公布了一门新的系统编程语言 Hare &#xff08;野兔&#xff09;。Hare 的开发时间接近两年半&#xff0c;它使用静态类型系统、手动内存管理和最小运行时&#xff0c;非常适合编写操作系统、系统工具、编译器以及其他低级高性能任务。据 …

java cuba_CUBA平台–新的Java企业应用程序框架

java cuba所以..你好&#xff0c;世界&#xff01; 我们的英语网站终于可以正常使用了&#xff0c;现在每个人都可以下载该平台&#xff0c;并可以以前所未有的速度更快地创建业务应用程序。 在我们决定与国际Java社区共享足够好之前&#xff0c;我们花了六年的永久发展和偶尔的…

linux设备驱动开发详解源码,linux设备驱动开发详解光盘源码.rar

压缩包 : linux设备驱动开发详解光盘源码.rar 列表19/busybox源代码/busybox-1.2.1.tar.bz219/MTD工具/mtd-utils-1.0.0.tar.gz19/nand驱动范例/s3c2410.c19/nor驱动范例/s3c2410nor.c19/yaffs&yaffs2源代码/yaffs.tar.gz19/yaffs&yaffs2源代码/yaffs2.tar.gz20/USB串口…

进程、线程、协程三个概念傻傻分不清

点击蓝字关注我们进程&#xff0c;是并发执行的程序在执行过程中分配和管理资源的基本单位&#xff0c;每一个进程都有一个自己的地址空间&#xff0c;即进程空间或&#xff08;虚空间&#xff09;。进程空间的大小 只与处理机的位数有关&#xff0c;一个 16 位长处理机的进程空…

随机数发生器怎么用_用随机数发生器射击自己的脚

随机数发生器怎么用这将不是解释随机数生成器毕竟不是那么随机的文章之一。 因此&#xff0c;您中的那些人希望获得有关如何破解老虎机&#xff0c;继续前进的指南&#xff0c;在这里什么也看不到。 相反&#xff0c;它是有关一个不太常见的锁争用问题的帖子&#xff0c;该问题…

linux 4.14.2编译,vmware中linux内核2.6.14.4编译全过程_linux教程

很久就开始尝试编译Linux内核&#xff0c;但是总是遇到不少的问题&#xff0c;经过几十次的编译&#xff0c;直到现在才解决&#xff0c;人都要崩溃了。所以干脆把这个过程写出来&#xff0c;希望在你遇到同样问题的时候少走点弯路。我用的是Red Hat Linux 9. 内核版本是2.6.14…

C++ STL deque 容器底层实现原理(深度剖析)

点击蓝字关注我们什么是多态&#xff0c;多态有什么用途&#xff1f;定义&#xff1a;“一个接口&#xff0c;多种方法”&#xff0c;程序在运行时才决定调用的函数。实现&#xff1a;C多态性主要是通过虚函数实现的&#xff0c;虚函数允许子类重写override(注意和overload的区…