工厂模式理解_工厂模式

工厂模式理解

工厂模式是一种创新的设计模式,其目的是提供一个接口,用于创建相关或相关对象的族,而无需指定其具体类。 创建逻辑封装在工厂中,该工厂提供创建逻辑的方法或将对象的创建委托给子类。 客户端不知道接口或类的不同实现。 客户端只需要知道工厂即可用于获取接口实现之一的实例。 客户端与对象的创建是分离的。

通常,工厂模式以单例或静态类的形式实现,因为只需要一个工厂实例。 这样集中了对象的创建。

CDI框架

在Java EE中,我们可以利用CDI框架来创建对象,而无需了解对象创建的详细信息。 这种脱钩是Java EE实现控制反转的方式的结果。 传达的最重要的好处是将较高级别的类别与较低级别的类别分离。 这种解耦使具体类的实现可以更改而不会影响客户端:减少耦合并提高灵活性。

CDI框架本身是工厂模式的实现。 容器在应用程序启动期间创建合格对象,并将其注入到与注入标准匹配的任何注入点中。 客户端不需要知道关于对象的具体实现的任何信息,甚至客户端都不知道具体类的名称。

public class CoffeeMachine implements DrinksMachine {// Implementation code}

像这样使用它:

@InjectDrinksMachine drinksMachine;

在这里,容器创建了CoffeeMachine具体类的实例,根据其接口DrinksMachine进行选择,并在容器找到合格注入点的任何位置进行注入。 这是使用工厂模式的CDI实现的最简单方法。 但是,它不是最灵活的。

消歧

如果我们有多个DrinksMachine接口的具体实现, 将会发生什么?

public class CoffeeMachine implements DrinksMachine {// Implementation code} public class SoftDrinksMachine implements DrinksMachine {// Implementation code}

应该注入哪种实现? SoftDrinksMachineCoffeeMachine

@InjectDrinksMachine drinksMachine;

容器不知道,因此部署将因“模棱两可的依赖项”错误而失败。

资格赛

那么容器如何区分具体的实现? Java EE为我们提供了一个新工具:限定符。 限定词是自定义注释,用于标记具体的类以及容器要注入对象的位置。

回到我们的Drinks机器以及两个相同类型的CoffeeMachineSoftDrinksMachine的具体类,我们将通过使用两个限定符来区分它们:

@Qualifier@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.METHOD, ElementType.FIELD})public @interface SoftDrink
@Qualifier@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.METHOD, ElementType.FIELD})public @interface Coffee

我们创建一个限定符名称SoftDrink 。 这将注释SoftDrinksMachine混凝土类,而Coffee将注释CoffeeMachine类。

@Target注释限制了我们可以在哪里使用这些限定符标记注入点,在这种情况下,是在方法和字段注入点上。 具有保留策略RUNTIME的注释可确保注释在运行时可用于JVM。

Target的可能值为:TYPE,METHOD,FIELD,PARAMETER。

正确标注了DrinksMachine接口的两个具体实现。 CoffeeMachine类的注释为@Coffee,SoftDrinksMachine类的注释为@SoftDrink

@Coffeepublic class CoffeeMachine implements DrinksMachine {// Implementation code}
@SoftDrinkpublic class SoftDrinksMachine implements DrinksMachine {// Implementation code}

现在,您注释注入点。 使用限定符@SoftDrink表示要在容器中注入SoftDrinksMachine类的位置,并使用限定符@Coffee来在容器中注入CoffeeDrinkMachine的位置 。 现在,我们已经向容器明确了应该在哪里注入我们的具体实现,并且部署将成功。

@Inject @SoftDrinkDrinksMachine softDrinksMachine;
@Inject @CoffeeDrinksMachine coffeeDrinksMachine;

我们已经了解了Java EE的CDI框架如何实现工厂模式,如何隐藏对象的具体实现并允许创建与使用分离。 我们已经看到了如何使用限定符来选择所需的实现,而无需了解有关对象创建的任何知识。

重要的是要记住,CDI框架只会实例化满足托管Bean规范JSR 299的所有条件的POJO。但是,如果您要注入的对象没有,那意味着我们不能利用CDI怎么办?框架针对不符合要求的类的注入功能。 不,不是。 Java EE为我们提供了一个解决方案。 让我们更深入地研究一下如何使用CDI框架将ANY类型的ANY类注入到注入点中。

生产者方法

Java EE具有称为生产者方法的功能。 这些方法提供了一种实例化方式,因此可用于不符合托管bean规范的注入对象,例如需要使用构造函数参数进行正确实例化的对象。 其值可能会在运行时更改的对象以及其创建需要进行一些自定义初始化的对象,也可以通过生产者方法准备好进行注入。

让我们看一个生产者方法,该方法产生一个用Books对象填充的List。

@Produces@Librarypublic List<Book> getLibrary(){// Generate a List of books called 'library'return library;}

Book对象列表将被注入到注解点@Library中。

像这样使用它:

@Inject @LibraryList<Books> library;

生产者方法的一个重要特征是它的范围。 这将确定何时调用该方法以及该方法产生的对象将保留多长时间。

默认情况下,生产者方法范围是@DependentScoped 。 这意味着它将继承其客户范围。

我们可以通过扩大范围来进一步扩展此示例。 如果我们对生产者方法@RequestScoped进行注释,则它将对其参与的每个HTTP请求仅调用一次,并持续到请求的持续时间。

@RequestScoped@Produces@Librarypublic List<Book> getLibrary(){// Generate a List of books called 'library'return library;}

可能的范围是:

  • RequestScoped – HTTP请求范围
  • SessionScoped – HTTP会话范围
  • ApplicationScoped –在用户之间共享
  • ConversationScoped –与JSF的交互
  • DependentScoped –默认,从客户端继承

优点:易于实现,没有样板代码,神奇地工作,任何对象都可以注入,按类自动配置

错误:命名注释类型不安全

和丑陋:隐藏对象创建,难以遵循执行流程,IDE应该有所帮助

翻译自: https://www.javacodegeeks.com/2015/12/factory-pattern.html

工厂模式理解

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

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

相关文章

服务器双向认证 原理,什么叫SSL双向认证 SSL双向认证过程是怎样的

我们都知道SSL认证能够分成SSL双向认证和SSL单向认证。那么&#xff0c;什么是SSL双向认证&#xff1f;SSL双向认证过程又是怎样的&#xff1f;小编就在接下来的内容为各位详细讲述。什么叫SSL双向认证SSL双向认证则是需要是服务端需要客户端提供身份认证&#xff0c;只能是服务…

发送结构化数据Client端

#include<iostream> #include<Windows.h> using namespace std;struct DataPack {int age;char name[32];};int main() {//初始化ws2_32.dllWORD ver MAKEWORD(2, 2);WSADATA wsaData;WSAStartup(ver, &wsaData);//对应WSACleanup的调用//1.建立一个socketSOC…

依赖: ros-melodic-desktop 但是它将不会被安装_npm系列之依赖管理

1. 版本控制npm依赖包使用语义化的版本号&#xff0c;让开发者可以从版本号中推测修改。版本号格式为&#xff1a;X.Y.ZX&#xff1a;代表主版本号&#xff0c;只有更新了不向下兼容的API时才需要修改Y&#xff1a;次版本号&#xff0c;当模块增加了向下兼容的功能时需要修改Z&…

java编写代理服务器_如何编写Java代理

java编写代理服务器对于vmlens &#xff08;轻量级Java竞争条件捕获器&#xff09;&#xff0c;我们使用Java代理来跟踪字段访问。 这是我们学习的实现此类代理的经验教训。 开始 使用“静态公共静态无效值premain&#xff08;String args&#xff0c;Instrumentation inst&am…

怎么修改ipv4服务器,如何修改ipv4 wins 服务器地址

如何修改ipv4 wins 服务器地址 内容精选换一换IPv6的使用&#xff0c;可以有效弥补IPv4网络地址资源有限的问题。如果当前云服务器使用IPv4&#xff0c;那么启用IPv6后&#xff0c;云服务器可在双栈模式下运行&#xff0c;即云服务器可以拥有两个不同版本的IP地址&#xff1a;I…

C++ 【随想录】(二)指针常量与常量指针精解【一次掌握】

关于指针常量和常量指针 const int *x int *const y 在前先读&#xff0c;在前不变 *&#xff08;指针&#xff09;和const(常量&#xff09;谁在前先读谁&#xff1b; *代表被指的数据&#xff0c;名字代表指针地址 const在谁前谁不变

python 追加到字典_使用Python读取,写入和解析JSON

JSON是用于数据交换的轻量级数据格式&#xff0c;可以很容易地被人类读取和写入&#xff0c;也可以由机器轻松解析和生成。它是一种完全独立于语言的文本格式。为了处理JSON数据&#xff0c;Python有一个名为的内置包json。示例&#xff1a; s {“ id”&#xff1a;01&#xff…

couchbase_适用于具有Couchbase和WildFly的多容器和多主机应用程序的Docker Machine,Swarm和Compose...

couchbase该博客将说明如何使用Docker创建部署在多个主机上的多容器应用程序。 这将使用Docker Machine&#xff0c;Swarm和Compose实现。 是的&#xff0c;这三个工具一起使这个博客变得更加有趣&#xff01; 该图说明了关键组件&#xff1a; Docker Machine用于配置多个D…

云服务器可以文件服务器,云服务器 可以上传文件

云服务器 可以上传文件 内容精选换一换安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具&#xff0c;将文件上传到云服务器。例如QQ.exe。在本地主机和Windows云服务器上分别安装数据传输工具&#xff0c;将文件上传到云服务器。例如QQ.exe。本地磁盘映射(推荐使…

机智云代码移植_IoT开发者 | 基于STM32F103的机智云宠物屋外加4路继电器开源教程...

[ 写在前面 ]自智云社区开辟IoT开源项目专区以来&#xff0c;一直有IoT开发者在贡献案例。玛莉甄选了一些具有代表性的案例分享给IoT爱好者们&#xff0c;本文亦如此。若你有好的案例&#xff0c;想和IoT爱好者们分享&#xff0c;欢迎投稿&#xff0c;一经采纳&#xff0c;我们…

drools。drools_Drools:fireAllRules,fireUntilHalt和Timers内部代码清理的详细说明

drools。drools在六月&#xff0c;我们在博客上发布了一个新的内部状态机&#xff0c;用于管理用户&#xff0c;计时器和引擎线程之间的交互。 现在&#xff0c;我们对该代码进行了另一次大的内部清理&#xff0c;以使其更易于阅读和理解。 如前所述&#xff0c;所有操作&…

云服务器文件打包,云服务器文件打包

云服务器文件打包 内容精选换一换Winscp无法连接到服务器。SSH连接工具例如Xshell可以正常连接云服务器。其他SSH工具连接云服务器正常&#xff0c;但是Winscp无法连接到服务器。说明SSH服务是没有问题的&#xff0c;Winscp连接基于的是SFTP协议。查看/etc/ssh/sshd_config文件…

完全复制一个dict_Redis主从复制getshell技巧

Redis未授权漏洞常见的漏洞利用方式&#xff1a;Windows下&#xff0c;绝对路径写webshell 、写入启动项。Linux下&#xff0c;绝对路径写webshell 、公私钥认证获取root权限 、利用contrab计划任务反弹shell。基于Redis主从复制的机制&#xff0c;可以完美无损的将文件同步到…

关于select中fd_set变量的一些通俗宏解释

FD_ZERO(fd_set*fdset) 将fd_set变量的所有位初始化为0&#xff1b; FD_SET(int fd,fd_set*fdset) 在参数fdset指向的变量中注册文件描述符fd的信息 FD_CLR(int fd,fd_set*fdset) 在参数fdset指向的变量中清除文件描述符fd的信息 FD_ISSET(int fd,fd_set*fds…

pcl_openmap_OpenMap教程3 –使用MapHandler构建基本的地图应用程序–第2部分

pcl_openmap1.简介 在上一教程中&#xff0c;我们了解了MapHandler如何将各种组件连接在一起&#xff08;更具体地说&#xff0c;是从MapHandlerChild派生的类&#xff09;。 我们看到了如何以编程方式执行此操作&#xff0c;但是还有另一种声明性地使用openmap.properties 。 …

文件服务器缓存加速,存储缓存为文件传输提速

存储缓存为文件传输提速本文首次刊登于《网络世界》。著作权&复制权属于《网络世界》。保留所有权利。 一种新型产品实现了WAN上的文件缓存&#xff0c;使以LAN速度长距离存取数据成为可能。存储缓存设备消除了通常困扰远程文件共享的延迟难题。 在当前的办公室环境…

xy轴坐标图数字表示_【相机标定】四个坐标系之间的变换关系

点击上方“新机器视觉”&#xff0c;选择加"星标"或“置顶”重磅干货&#xff0c;第一时间送达世界坐标系&#xff0c;相机坐标系&#xff0c;图像物理坐标系&#xff0c;像素坐标系之间的关系&#xff1a;首先看下几个坐标系在放在一块的样子&#xff1a;1&#xff…

完全二叉树基本操作(不含遍历)

/*准备数据*/#define MANLEN 20 //最大长度 typedef char DATA; //定义元素类型 typedef struct CBT //定义二叉树结点类型 {DATA data; //元素数据struct CBT* left; //左子树结点指针struct CBT* r…

1.0jpa 2.0_Java EE 7之前版本替代JPA 2.1非同步持久性上下文

1.0jpa 2.0Java EE 7中的非同步持久性上下文 JPA 2.1引入了非同步持久性上下文的概念&#xff0c;该概念允许对JPA实体管理器的刷新进行细粒度控制&#xff0c;即通过显式调用EntityManager&#xff03;joinTransaction 。 以前&#xff0c;这默认情况下是JTA事务的结束&#x…

算法:删除顺序表中重复的元素

//删除数组中重复的元素 //思路&#xff1a;通过起始位置的元素&#xff0c;逐个和后面的元素进行比较&#xff0c;找到相同的元素后执行删除操作。没有发现执行第二次循环void purge(int a[], int len) {int i 0, j;while (i<len) //从数组开始第一个位置开始循环{j …