这种实例化方法是否遵循设计模式和干净的代码?



我正在写一个小游戏,我用 Kotlin 来做这件事。我想使用以下类对建筑物进行建模:

class Building (
val name: String,
val inputs: Array<Resource>,
val outputs: Array<Resource>
) {}

我想为地图创建此类的多个实例,但我不想每次都用同一建筑物的相同数据填充构造函数参数。所以我的想法是使构造函数私有并在 compainon 对象中编写创建者函数。

class Building private constructor(
val name: String,
val inputs: Array<Resource>,
val outputs: Array<Resource>
) {
companion object {
fun createWoodcutter(): Building = Building(
"Woodcutter",
arrayOf(
Resource(ResourceType.WOOD, 1),
Resource(ResourceType.WORKFORCE, 3),
Resource(ResourceType.MONEY, 10)
),
arrayOf(Resource(ResourceType.PLANKS, 1))
)
}
}

但我不知道这种策略是否算作干净的代码,或者是否有更好的方法或设计模式?

其他选项:使用特殊方法(类似于简单工厂模式(,如下所示:

enum class TypeBuilding { WOOD, CONCRETE, METAL }
...
fun createBuilding(type: TypeBuilding) = when (type) {
TypeBuilding.WOOD -> Building("Woodcutter", ...)
TypeBuilding.CONCRETE -> Building("Concrete", ...) 
TypeBuilding.METAL -> Building("Metal", ...)
}
...
val building1 = createBuilding(TypeBuilding.WOOD)
val building2 = createBuilding(TypeBuilding.CONCRETE)
val building3 = createBuilding(TypeBuilding.METAL)
val building4 = createBuilding(TypeBuilding.WOOD)
...

在我看来,您的变体非常适合创建具有一组固定类型的对象,并且是干净的代码,因为它不会影响 Building 类的逻辑。必要时,还可以创建一个公共构造函数来创建任意对象:

class Building(
val name: String,
val inputs: Array<Resource>,
val outputs: Array<Resource>
) {
companion object {
fun createWoodcutter(): Building = ... 
}
}

最新更新