在Java中是否可以创建一个静态工厂方法/类,它使用接口作为参数化类型并返回给定接口的实现类?
虽然我对泛型的了解有限,但这就是我想要做的:
// define a base interface:
public interface Tool {
// nothing here, just the interface.
}
// define a parser tool:
public interface Parser extends Tool {
public ParseObject parse(InputStream is);
}
// define a converter tool:
public interface Converter extends Tool {
public ConvertObject convert(InputStream is, OutputStream os);
}
// define a factory class
public class ToolFactory {
public static <? extends Tool> getInstance(<? extends Tool> tool) {
// what I want this method to return is: …Run Code Online (Sandbox Code Playgroud) 我正在开发一种从语言A到B的翻译器(是的,它有点像编译器).翻译通常来自几个不同的文件,每个文件都有相同的3个部分进行翻译.所以,我这样做的方式,我有以下方式:

当我实例化一个翻译器并给它一些数据时,它需要生成所有需要的FileTranslator类.因为我不应该new在翻译中做,我应该从上面要求一个工厂.Sections译员也是如此.这就产生了一个问题,即我不得不创建许多样板工厂.此外,每个翻译人员可能需要更多的工厂来生成他们可能想要使用的其他类.
我认为这是错误的方式还是它的方式?我不允许在这个项目中使用任何类型的DI/IoC框架,顺便说一下.
我担心我没有收到我的消息.
在这种特定情况下,由于我的Translator类需要能够随时生成一些FileTranslator,因此需要FileTranslatorFactory.我知道我可以让一个IoC容器为我做接线,但IoC容器本身不会因为必须编写FileTranslatorFactory本身代码的问题而省去我.我对吗?
现在,问题在于FileTranslator还必须能够在需要SectionATranslators,SectionBTranslators和SectionCTranslators时生成(并且不认为它们是相似的,因为它们的名称是 - 它们完全不同并且与每个都无关其他!).所以我必须为每一个定义工厂.所以对于这样一个简单的5类系统,我需要创建4个(!!!)工厂.
因为我不希望我的域对象依赖于IoC-Container而且我不想为所有似乎需要的4种对象都有一个工厂,我还缺少一些东西吗?
我有一个大工厂,我正在试图弄清楚如何让它看起来很漂亮.
大约有40种可能的对象/构造函数组合:
if(algorithm == "SHA-1")
return new HashImpl<...>(algorithm, seed, size);
if(algorithm == "SHA-224")
return new HashImpl<...>(algorithm, seed, size);
if(algorithm == "SHA-256")
return new HashImpl<...>(algorithm, seed, size);
...
if(algorithm == "AES" || algorithm == "AES128")
return new BlockCipherImpl<...>(algorithm, seed, size);
...
if(algorithm == "HmacSHA1")
return new HmacImpl<...>(algorithm, seed, size);
...
Run Code Online (Sandbox Code Playgroud)
有没有办法将其放入地图中,这样我至少可以取消顺序搜索?我在弄清楚如何使构造函数成为一个仿函数时遇到了问题.
编辑:代码可以在这里找到:
http://code.google.com/p/owasp-esapi-cplusplus/source/browse/trunk/src/crypto/SecureRandomImpl.cpp,从第130行开始.
失败了Database db = DatabaseFactory.CreateDatabase();,我不知道为什么。我用声明的手动参数执行了存储过程,她工作得很好。不过,我没有收到错误或任何要处理的信息,所以我不确定出了什么问题。我在每一行之前和之后的代码中插入一个中断,并在该Database db = DatabaseFactory.CreateDatabase();行之后停止,在我告诉 IDE 继续之后,它会跳过该行并且函数结束。
作为记录,我的参考资料也很可靠。我已经从我做过的另一个项目中蚕食了这段代码,所以我可能只是遗漏了一些愚蠢的东西。无论如何,这是代码:
public class PullDebtor
{
public static DataTable ClientNumber(string strClientID)
{
DataSet dsDebtor = new DataSet();
dsDebtor.Tables.Add("Debtors");
DbCommand dbCommand = null;
try
{
Database db = DatabaseFactory.CreateDatabase();
string sqlCommand = "sp_PullClientID";
DbCommand dbCommand1 = db.GetSqlStringCommand(sqlCommand);
dbCommand1.CommandType = CommandType.StoredProcedure;
db.AddInParameter(dbCommand1, "@ClientID", DbType.String, strClientID);
db.ExecuteNonQuery(dbCommand1);
dsDebtor = db.ExecuteDataSet(dbCommand1);
}
catch
{
return dsDebtor.Tables[0];
}
finally
{
}
return dsDebtor.Tables[0];
}
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个 Django 模型,我需要从中派生出许多表。有点像工厂。所有表的架构相同,但表名不同。例如
class MyModel(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=100,blank=False)
class Meta:
db_table = 'mytable'
Run Code Online (Sandbox Code Playgroud)
我需要在数据库中,我有表 mytable01、mytable02、mytable03 ...
在models.py 中执行此操作的最佳方法是什么
你如何从另一家工厂生产工厂?使用下面的控制台告诉我有一个错误(注入器:unpr).
angular.module( 'fb.services', [] ).factory( 'getQueryString', function() {
return { call: function( qs ) {
var result = {}, queryString = qs.substring( 1 ), re = /([^&=]+)=([^&]*)/g, m;
while ( m = re.exec( queryString ) )
result[decodeURIComponent( m[1] )] = decodeURIComponent( m[2] );
return result;
}}
});
angular.module( 'fb.services', ['fb.services'] ).factory( 'getReferrer', function( getQueryString ) {
var qry = getQueryString.call( 'query=string&this=that' );
// fails to find getQueryString
});
Run Code Online (Sandbox Code Playgroud) 我正在将一些Java代码转换为C++,我希望保持类结构类似.但是,我遇到了以下问题,我不知道如何解决; 我在Java中这样做:
public class Mother {
protected Father make;
public Mother(){
make = maker();
make.print(); };
public Father maker(){
return new Father();};}
public class Daughter extends Mother {
public Daughter(){
super();}
@Override
public Father maker(){
return new Son();};}
public class Father {
public void print(){
System.out.println("I am the Father!\n");}}
public class Son extends Father {
@Override
public void print(){
System.out.println("I am the son!\n");};}
public static void main(String[] args) {
Daughter dot = new Daughter();
}
Run Code Online (Sandbox Code Playgroud)
会产生:我是儿子! 而:
class father{ …Run Code Online (Sandbox Code Playgroud) 我有以下捆绑包: - GreetingAPI(定义greeting()方法的包)(服务) - GreetingImpl1(实现英语模式的greeting()方法的包) - GreetingImpl2(实现意大利模式的greeting()方法的包) - GreetingConsumer(使用问候语服务的包)
我如何创建一个基于给定语言参数的组件(我认为它是一个工厂),让消费者包使用不同的服务实现.
我正在寻找以类似于Java类的方式编写面向对象的JavaScript(JS)代码的最佳方法.
工厂函数(FF)看起来像是一种在JS中提供类类功能的非常有前途的方式,到目前为止,我一直在构建它们:
function FF(constructorArg)
{
var _privateName = constructorArg;
var publicMessage = "Hello StackOverflow";
function publicMethodGetName() {
return _privateName;
}
return {
publicMethodGetName: publicMethodGetName,
publicMessage: publicMessage
};
}
Run Code Online (Sandbox Code Playgroud)
但是,我最近发现,与原型方法不同,这种样式的FF为每个FF实例重新创建每个方法,因此可能会降低性能.
在这个优秀主题的第二个答案中,Eric Elliot谈到了FF:
如果将原型存储在父对象上,这可能是动态交换功能的好方法,并为对象实例化启用非常灵活的多态性.
我在网上找不到这个例子.任何人都可以向我解释我如何使用上面的FF来做到这一点?
如果我知道将从同一个FF创建许多对象,这是否意味着我可以将FF切换为使用原型方法?
我正在尝试实现一个字符工厂,但我无法理解如何创建一个通用的shared_ptr到虚拟基类,然后将其转换为构造函数中带有参数的派生类.在我的示例中,我的虚拟基类不能在构造函数中获取参数,但我需要在派生类的构造函数中使用它们.
std::shared_ptr<Character> CharacterFactory::createCharacter(Character::Type type, Character::SubType subtype, const TextureHolder &textures, sf::Vector2u windowSize) {
std::shared_ptr<Character> character;
if ( type == Character::enemy ) {
std::dynamic_pointer_cast<Enemy>(character)(subType, textures, windowSize);
} else if(type == Character::player) {
//cast to player ...
}
return character;
Run Code Online (Sandbox Code Playgroud)
可能这是一个设计问题,我无法解决它.我不能使用原始指针,如果我能想到的话
character = new Enemy(...);
Run Code Online (Sandbox Code Playgroud)
本来会有用的.我发现的所有铸造示例都使用默认构造函数.
谢谢您的帮助