我对工厂的理解是它封装了所有继承公共抽象类或接口的具体类的实例化.这允许客户端与确定要创建哪个具体类的过程分离,这反过来意味着您可以从程序中添加或删除具体类,而无需更改客户端的代码.你可能不得不改变工厂,但工厂是"专门建造的",实际上只有一个改变的理由 - 添加/删除了一个具体的类.
我已经构建了一些实际上封装了对象实例化的类,但原因不同:对象很难实例化.目前,我将这些类称为"工厂",但我担心这可能是一种误称,并会混淆其他可能会查看我的代码的程序员.我的"工厂"类没有决定实例化哪个具体类,它们保证一系列对象将以正确的顺序实例化,并且当我调用时,正确的类将被传递给正确的构造函数new().
例如,对于我正在处理的MVVM项目,我编写了一个类来确保我SetupView的实例化得当.它看起来像这样:
public class SetupViewFactory
{
public SetupView CreateView(DatabaseModel databaseModel, SettingsModel settingsModel, ViewUtilities viewUtilities)
{
var setupViewModel = new SetupViewModel(databaseModel, settingsModel, viewUtilities);
var setupView = new SetupView();
setupView.DataContext = setupViewModel;
return setupView;
}
}
Run Code Online (Sandbox Code Playgroud)
把它称为"工厂"是否令人困惑?它不决定几个可能的具体类,它的返回类型不是接口或抽象类型,但它确实封装了对象实例化.
如果它不是"工厂",它是什么?
编辑
很多人都认为这实际上是Builder Pattern.
从dofactory定义Builder Pattern 如下:
将复杂对象的构造与其表示分开,以便相同的构造过程可以创建不同的表示.
这似乎也有点延伸.困扰我的是"不同的表现形式".我的目的不是抽象构建视图的过程(不是那个不值得的目标).我只是想在一个地方设置创建特定视图的逻辑,这样如果任何成分或创建该视图的过程发生变化,我只需要更改这一个类.构建器模式似乎真的在说,"让我们创建一个创建视图的一般过程,然后您可以为您创建的任何视图执行相同的基本过程." 很好,但那不是我在这里做的.
编辑2
我刚刚在维基百科关于依赖注入的文章中找到了一个有趣的例子.
在"Manually Injected依赖"下,它包含以下类:
public class CarFactory {
public static Car buildCar() {
return new Car(new SimpleEngine());
}
}
Run Code Online (Sandbox Code Playgroud)
这几乎是完全相同 …
希望这是一个新问题,或者只是我遗漏了一些明显的问题.请帮忙!我在我的AS3应用程序中嵌入了一个字体.我正在做所有的事情并且它是半工作的.
在我的主要课堂上,
[Embed(source="Art/moolbor.ttf", fontFamily="MoolEmbed",
mimeType="application/x-font")]
var MoolEmbed:Class;
Run Code Online (Sandbox Code Playgroud)
然后在我的代码中:
var newFormat:TextFormat = new TextFormat();
newFormat.font = "MoolEmbed";
newFormat.size = 20;
newFormat.color = 0xFCF374;
year.autoSize = TextFieldAutoSize.LEFT;
year.text = "Hello World";
year.embedFonts = true;
year.setTextFormat(newFormat);
year.antiAliasType = "advanced";
Run Code Online (Sandbox Code Playgroud)
这完美无缺,文字显示得很漂亮.我可以旋转它,alphas适用于它,它很好地抗锯齿.问题是文本字段是动态的 - 稍后在代码中:
year.text = "And a second hello world";
Run Code Online (Sandbox Code Playgroud)
一旦触发此代码,文本字段就会完全消失.我打开
year.border = true;
Run Code Online (Sandbox Code Playgroud)
我可以看到文本字段仍然存在,但它的大小已经缩小到几个像素.想想也许是autoSize搞砸了,
//year.autoSize = ...;
Run Code Online (Sandbox Code Playgroud)
同样的问题.考虑到它可能是嵌入式,我评论了这条线:
//year.embedFonts = true;
Run Code Online (Sandbox Code Playgroud)
文本字段返回工作状态,但(可理解地)失去了执行alpha和旋转的能力.
知道发生了什么事吗?
我的Visual Studio 2008项目引用了两个(外部)程序集(A + B),这两个程序集恰好引用了相同的第三个程序集(C).但是,程序集A期望程序集C具有一个公钥,该公钥与程序集B期望的公钥不同.
这是一个明显例外的例子:
无法加载文件或程序集'Newtonsoft.Json,Version = 3.5.0.0,Culture = neutral,PublicKeyToken = 9ad232b50c3e6444'或其依赖项之一.定位的程序集的清单定义与程序集引用不匹配.(HRESULT异常:0x80131040)
当然,我不能在同一目录中放置两个版本的C(只有公钥不同),因为它们的文件名是相同的.其次,我发现使用配置文件中的程序集绑定只允许版本映射,而不是公钥映射.
我还尝试将其中一个程序集C放在一个单独的目录中,并将CLR配置为在加载程序集时在该目录中进行搜索.不幸的是,我无法让它工作.
我知道重新编译其中一个外部库(其中一个恰好是开源的)可以解决这个问题,但如果不是绝对必要,我不想将这个负担添加到我的维护计划中.
所以我的问题是:如何引用程序集C的两个"版本",它们只有公钥不同?
UPDATE
我偶然发现了一个相关问题的答案,使用ilmerge提供了一个有趣的解决方案.我还没有检查过它,但对于遇到这个问题的人来说这可能是有用的.
我正在接受Clojure的努力,并试图习惯功能编程.
我一直在将各种命令功能从其他语言翻译成他们的Clojure等价物 - 到目前为止,一切都进展顺利.但是,我现在遇到了一个棘手的问题,我不知道如何将这种Java方法转换为惯用的Clojure.
起初"地图"看起来像是正确的工具,但在玩了一下之后,我不太确定.有人能告诉我如何在Clojure中编写这个函数吗?
谢谢!
public String calculateChecksum(String str)
{
String hash = "bjytk3lfj%3jklDskj";
int key = 1690912;
for(int i=0; i < str.length(); i++) {
key = key ^ (int)(hash.charAt(i%hash.length()))^(int)(str.charAt(i));
key = key>>>23|key<<9;
}return "8"+toHex8(key>>>(8&255))+toHex8(key&255);
}
Run Code Online (Sandbox Code Playgroud) 我有以下visual c ++代码
#include <iostream>
#include <string>
#include <sstream>
#include <math.h>
using namespace std;
int Main()
{
double investment = 0.0;
double newAmount = 0.0;
double interest = 0.0;
double totalSavings = 0.0;
int month = 1;
double interestRate = 0.065;
cout << "Month\tInvestment\tNew Amount\tInterest\tTotal Savings";
while (month < 10)
{
investment = investment + 50.0;
if ((month % 3 == 0))
{
interest = Math::Round((investment * Math::Round(interestRate/4, 2)), 2);
}
else
{
interest = 0;
}
newAmount = investment …Run Code Online (Sandbox Code Playgroud) 如何提取pwd输出的最后一个目录?我不想使用目录结构中有多少级别的任何知识.如果我想使用它,我可以做类似的事情:
> pwd
/home/kiki/dev/my_project
> pwd | cut -d'/' -f5
my_project
Run Code Online (Sandbox Code Playgroud)
但我想使用一个无论我在目录结构中的哪个位置都能工作的命令.我假设使用awk或sed执行此操作有一个简单的命令.
我有一个运行PHP 5的Intranet站点,需要列出一个只包含Excel文件的文件夹.
理想情况下,用户需要能够输入一些搜索条件(即日期),文件将被过滤成超链接列表.然后可以选择这些超链接以下载excel文件.
到目前为止我所拥有的是:
//get search parameters (from a form)
$s_Date = $_GET['s_Date'];
$s_Shift = $_GET['s_Shift'];
$s_Name = $_GET['s_Name'];
//search folder
foreach(glob("c:\folderA\folderB\*".$s_Date."*".$s_Shift."*".$s_Name."*.*") as $FileName)
{
echo basename($FileName);
echo"<a href=?myad=".basename($FileName)."/>Download</a>"."<br />";
}
Run Code Online (Sandbox Code Playgroud)
这将返回文件列表,但选择超链接不会提示下载.
如何获取超链接以强制使用内容类型的msexcel?
相关问题:使用短路评估的好处,为什么语言不能使用短路评估?,有人可以解释这行代码吗?(逻辑和分配运营商)
关于使用短路代码的语言的好处有疑问,但我想知道程序员有什么好处?只是它可以使代码更简洁一点吗?还是有性能原因?
我不是在询问有关两个实体需要进行评估的情况,例如:
if($user->auth() AND $model->valid()){
$model->save();
}
Run Code Online (Sandbox Code Playgroud)
对我而言,原因很清楚 - 既然两者都必须成立,那么如果用户无法保存数据,您可以跳过更昂贵的模型验证.
这对我来说也有明显的目的:
if(is_string($userid) AND strlen($userid) > 10){
//do something
};
Run Code Online (Sandbox Code Playgroud)
因为strlen()使用非字符串值调用是不明智的.
我想知道的是当它不影响任何其他语句时使用短路代码.例如,从Zend Application默认索引页面:
defined('APPLICATION_PATH')
|| define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));
Run Code Online (Sandbox Code Playgroud)
这可能是:
if(!defined('APPLICATION_PATH')){
define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));
}
Run Code Online (Sandbox Code Playgroud)
或者甚至作为一个声明:
if(!defined('APPLICATION_PATH'))
define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));
Run Code Online (Sandbox Code Playgroud)
那么为什么要使用短路代码呢?仅仅因为使用逻辑运算符代替控制结构的"酷"因素?要合并嵌套的if语句?因为它更快?
考虑:
$("#PlotPlace").append('<div style="position:absolute;left:200px;top:40px;font-size:smaller">Hello world!</div>');
我只有在结果文本的宽度小于60px时才需要执行该行.在放置物体之前如何检查宽度?
是否有一个原因,如果在我的程序中我要求用户输入,我这样做:
int number;
string str;
int accountNumber;
cout << "Enter number:";
cin >> number;
cout << "Enter name:";
getline(cin, str);
cout << "Enter account number:";
cin >> accountNumber;
Run Code Online (Sandbox Code Playgroud)
为什么在输入第一个数字后,它输出"输入名称",然后立即输入"输入账号",然后我甚至输入我的"str"为getline(cin,str)线?谢谢!