定义对象的“类型”

时间:2014-12-12 17:53:09

标签: oop design-patterns architecture

我试图实现一个可能只有一组已定义对象的类。这些物体显然具有所有相同的属性,但只是这些属性的值不同。
作为一个例子,想到类车。它有属性名称和ps。应该(仅)可以创建以下对象:

  • 汽车名称:'保时捷',PS:350;
  • 汽车名称:'宝马',PS:250;

不应该初始化即具有名称的汽车:'保时捷',PS:500; 在继续编码时,此列表可能会更改或扩展。

将类型创建为汽车的子类,在构造函数中设置它的值是一个好主意吗?或者设置某种工厂/创作者模式是否明智?

非常感谢你的想法 西蒙

2 个答案:

答案 0 :(得分:0)

创建子类取决于您的需求。基本上,如果您需要以某种方式有所不同的行为,请继续使用Factory创建子类。

如果您只需要使用取决于其他值的值来填充Car,则可以使用Builder pattern

如果您的对象值是具体的,并且您只需要从某种模板开始,请使用Prototype

答案 1 :(得分:0)

基本上,您希望隐藏构造过程的详细信息。由于您没有子类,因此具有Factory,Prototype和Builder的GoF解决方案可能过度设计。

我在使用静态初始化程序之前在Java游戏中解决了这个问题。以下示例显示了游戏中标准的武器配置。

public class Weapon {
    ...
    public static final Weapon 
        DAGGER = new Weapon("Dagger", 0, 1, -1, true, false), 
        RAPIER = new Weapon("Rapier", 9, 1, 0, false, false),
        CLUB = new Weapon("Club", 9, 1, 0, true, false),
    ...
}

您以Weapon.DAGGER等方式访问对象。我没有这样做,但可以/应该使构造函数变为私有。因此,其他人无法实例化武器类的无效变体。

如果需要具有相同配置的对象的多个实例,则替代构造函数可以采用枚举值,例如PORSCHE350,并且它将为该对象构造适当的值。

这种控制的极端案例将使用Object Constraint Language (OCL)之类的东西。