我已经开始阅读 Joshua Bloch 的“Effective Java”(第二版)。在阅读第 2 项(在面对许多构造函数参数时考虑一个构建器)时,作者在 Class.newInstance() 方法中做了一个特别的陈述。具体来说,作者说
The traditional Abstract Factory implementation in Java has been the "Class" object, with the "newInstance" method playing the part of the "build" method.
这部分让我有点困惑 - 我对抽象工厂设计模式的理解是它用于表示工厂的工厂。在我看来,Class.newInstance() 方法更接近于“静态工厂方法”编码哲学(顺便说一下,它是同一本书中的第 1 项)
想法,任何人?我一直在努力准备应对一些艰难的面试,如果我在参加此类面试之前基础扎实,我将不胜感激。
谢谢。
最佳答案
这是我的看法。
首先,抽象工厂模式并不是要成为工厂的工厂。这种模式的关键方面是有一个带有底层(可能无法访问)工厂实现的可访问接口(interface),通过它您可以获得(可能无法访问)对象实现的可访问接口(interface)。我知道,这是一个关于我如何理解 Gamma 书中这种模式的一些适用条件的冗长讨厌的文字游戏:
- a system should be independent of how its products are created, composed, and represented
- you want to provide a class library of products, and you want to reveal just their interfaces, not their implementations.
最后你得到的是对象,而不是工厂。
其次,我不会在模式概念和语言关键字之间建立 1:1 的关系。 “抽象工厂”不一定总是转换为 Java abstract class 或 interface 结构。只要您以某种方式保证客户端代码独立于底层工厂和对象实现,您仍然可以拥有一个代表“抽象工厂”的常规、可扩展、可实例化的类。 java.lang.Class 就是这种情况,它既不是抽象的也不是接口(interface),而是通过 newInstance()<> 方法。如果你像这样使用它可能会更清楚:
Object o = Class.forName(type).newInstance();
Class扮演“抽象工厂”,Object扮演“抽象产品”的类型实现。
最后,newInstance() 不是静态工厂方法,我认为是因为此模式旨在返回实现它的类的实例。 newInstance() 不返回 Class 或子 Class 的实例。它返回它代表的类型的实例。它也不是 Bloch 在他的书中所说的“工厂方法”。
关于java - Class.newInstance() 是否遵循 "Abstract factory"设计模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12270096/
我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou
我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案