我有四种类型的数据对象:
class DataTypeAlpha extends DataType
class DataTypeBeta extends DataType
class DataTypeGamma extends DataType
class DataTypeDelta extends DataType
以及来自 GUI 框架的四种不同的 TreeNode 类型,每一种都特定于包装的 DataType:
class AlphaTreeNode extends MyAppTreeNode
...
现在我经常遇到这样的模式,即我有一个 DataType 实例并且需要一个新的 MyAppTreeNode 实例。我看到两个解决方案。解决方案一:
class DataType {
// Instantiates and returns the appropriate MyAppTreeNode for this DataType
abstract MyAppTreeNode createTreeNode();
}
解决方案二:
class MyAppTreeNode {
static MyAppTreeNode createTreeNodeForDataType(DataType dataType) {
if(dataType instanceOf DataTypeAlpha) return new AlphaTreeNode((DataTypeAlpha)dataType)
else if (dataType instanceOf DataTypeBety) return new BetaTreeNode((DataTypeBeta)dataType)
else if ...
else if ...
else throw new IllegalArgumentException();
}
}
解决方案一使用多态性,更短更“优雅”。但我更希望 DataType 类对我使用的 GUI 框架一无所知。也许我什至可以使用两个不同的 GUI 框架?
你看到第三种解决方案了吗?我在这个问题中添加了 Guice 标签。也许 Guice 或其他依赖注入库中有一些函数可以在这里提供帮助?
浏览类似的问题:
- 当然我会为此使用工厂模式,但在工厂内部我仍然有问题。