Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何避免多态工厂模式中的大量样板文件_Java_Design Patterns - Fatal编程技术网

Java 如何避免多态工厂模式中的大量样板文件

Java 如何避免多态工厂模式中的大量样板文件,java,design-patterns,Java,Design Patterns,我有一个抽象的命令类。从某个类(Fetcher)创建的每个命令类都需要赋予某些属性。通常这看起来像一个工厂模式-Fetcher创建一个CommandFactory,它将在创建时准备命令。然而,大约有十几个派生类,我不知道如何做到这一点,而不为每个具体类使用不同的具体工厂,或者在每次创建新的命令类时必须扩展的不同方法createConcrete1Command。有什么策略吗?您可以尝试使用Class.forName(String)和Class.newInstance以编程方式创建新实例。虽然一般来

我有一个抽象的
命令
类。从某个类(
Fetcher
)创建的每个
命令
类都需要赋予某些属性。通常这看起来像一个工厂模式-
Fetcher
创建一个
CommandFactory
,它将在创建时准备
命令。然而,大约有十几个派生类,我不知道如何做到这一点,而不为每个具体类使用不同的具体工厂,或者在每次创建新的
命令
类时必须扩展的不同方法
createConcrete1Command
。有什么策略吗?

您可以尝试使用
Class.forName(String)
Class.newInstance
以编程方式创建新实例。虽然一般来说,我发现由于元类的缺乏,工厂模式总是适合于Java中的样板代码

比如(模块异常处理,并假设每个Foo类都有一个FooCommand类)

并在
Fetcher extensed AbstractFoo
上调用
createCommand()
,创建
FetcherCommand
的实例


这就是你要找的吗

我发现解决这种情况的方法如下:

建造商:

public BaseClass(Parameters p); // can be expanded and endowed as necessary; essentially anything a constructor can do can happen here.

当然,所有派生类都将使用
参数
作为参数,但是
参数
可以根据需要进行扩展,而无需接触任何派生类的构造函数。

我不确定我是否理解,但是如果每个命令类都有大量样板代码,您可以提取抽象命令类的公共性。从您的描述中不清楚如何知道要创建哪个命令子类。但是,一旦解决了这个问题,也许可以将工厂方法作为每个命令子类的静态方法。公共功能可以保存在命令基类的一个或多个方法中。这样,当您创建下一个命令子类时,您只需要在新类中实现新的工厂方法,而不需要接触任何现有代码。这太棒了。顺便问一下,您是否意识到“命令”只不过是一个不属于类的“函数”或“方法”调用(即尝试在OO语言中进行函数编程)
public BaseClass(Parameters p); // can be expanded and endowed as necessary; essentially anything a constructor can do can happen here.