工厂模式理解

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

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

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

工厂模式理解

工厂模式理解_工厂模式相关推荐

  1. python工厂模式 理解_浅谈Python设计模式 - 抽象工厂模式

    声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 在上一篇我们对工厂模式中的普通工厂模式有了一定的了解,其实抽象工作就是 表示针对 ...

  2. 商业模式新生代_商业模式设计方法之场景(化)——《商业模式新生代》之十二...

    今天我们来看#商业模式#设计方法的最后一种方法--场景,其实这里的场景不知道大家和我一样,看起来比较别扭,难以理解.因为这本书是舶来品,英译过来的,所以我只好用万能的百度来查了查,书里场景对应的单词是 ...

  3. 抽象工厂和工厂方法示例_工厂方法设计模式示例

    抽象工厂和工厂方法示例 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此 ...

  4. java与模式孙悟空_悟空模式-java-工厂方法模式

    [却说那七衣仙女自受了大圣的定身法术,一周天方能解脱,各提花篮,回奏王母说道:"齐天大圣使术法困住我等,故此来迟."王母问道:"汝等摘了多少蟠桃?"仙女道:&q ...

  5. java 策略模式和工厂模式区别_策略模式和工厂模式的区别

    工厂模式和策略模式看着很像,经常让人混淆不清; 它们的区别在哪里,需要细细体味: 相似点 在模式结构上,两者很相似: 差异 用途不一样 工厂是创建型模式,它的作用就是创建对象: 策略是行为型模式,它的 ...

  6. 商业模式新生代_商业模式新生代——商业模式设计

    商业模式设计步骤 客户洞察 创意构思 可视思考 原型制作 故事讲述 情景推测 客户洞察 1.基于客户洞察建立商业模式 我们要从客户的角度来看待商业模式,这样可以让我们找到全新的机会.这并不意味着要完全 ...

  7. 商业模式新生代_商业模式设计方法视觉化思考——《商业模式新生代》笔记之九...

    前言:慢慢来,比较快."财不入急门","您赚不到认知之外的钱"点击头像关注我,和您一起每天学习一点商业思维,提升自己的商业认知.我始终相信,方向对了,认知到了, ...

  8. 商业模式新生代_商业模式设计方法:讲故事——《商业模式新生代》笔记之十一...

    前言:今天我们继续来了解第五种商业模式的设计方法:讲故事.原创不易,喜欢商业与财经内容的朋友点点关注,谢谢您这么帅/美还关注我! 01什么是讲故事? 讲故事,有读者心里可能会觉得,这不就是我们日常中的 ...

  9. 商业模式新生代_商业模式新生代

    怎么能赚更多的钱.个人需要目标,同样企业也需要目标.当你求职时,你要知道两个目标是否有共融点.当你创业时,你要清楚的描绘出企业的目标. 对于企业的商业模式,你应该知道:你为什么要了解企业的商业模式.首 ...

最新文章

  1. 微信公众账号开发-发送模板消息
  2. Android 资源保护问题——探索
  3. binder-JAVA层机制
  4. 水晶报表——小代码,大作用(转自CSDN,阿泰)
  5. Tomcat7.0安装配置
  6. java创建oracle序列_java学习:Hibernate学习-用oracle sequence序列生成ID的配置示例
  7. 你真的以为你了解Java的序列化了吗
  8. MFC CPropertySheet 多页面切换 实例
  9. 2021年浙江省高考成绩查询时间,2021年浙江高考成绩什么时候出来 时间
  10. 微信浏览器跳转app解决方案
  11. 已取消到该网页的导航
  12. php sapi全拼,php sapi
  13. android4.4 获取符合默认短信应用要求的短信应用包名(改进篇)
  14. 金融与python-基于Python的金融分析与风险管理
  15. 教会你ECshop安装百度分享按钮教程
  16. 实现QQ表情功能(1)
  17. INS-20802 Windows安装Oracle19c报错解决方案
  18. 双宽带双路由搭建同一网段局域网
  19. 装机不求人,适合“懒人”的系统安装方法
  20. eclipse反编译插件不能用

热门文章

  1. YbtOJ-毒瘤染色【LCT】
  2. P1903-[国家集训队]数颜色/维护队列【带修莫队】
  3. bzoj4403-序列统计【Lucas,组合数学】
  4. USACO2.4の其中3道水题【模拟,图论】
  5. 初一模拟赛(4.20)
  6. P3157 动态逆序对 ,树状数组套动态开点线段树
  7. JavaFX键盘事件
  8. MySQL nullif()函数
  9. Oracle入门(三B)之11G新特性 SYSASM 角色用来管理ASM
  10. Oracle入门(三A)之sqlplus