【问题标题】:Defining "types" of objects定义对象的“类型”
【发布时间】:2014-12-15 04:39:50
【问题描述】:

我正在尝试实现一个可能只有一组已定义对象的类。这些对象显然具有所有相同的属性,但仅在这些属性的值上有所不同。
以汽车类为例。它具有属性 name 和 ps。应该(仅)可以创建以下对象:

  • 汽车名称:'Porsche',PS:350;
  • 汽车名称:'BMW',PS:250;

应该无法初始化,即名称为:'Porsche',PS:500 的汽车; 在继续编码时,此列表可能会更改或扩展。

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

非常感谢您的想法
西蒙

【问题讨论】:

  • 这里的经典模式是工厂

标签: oop design-patterns architecture


【解决方案1】:

基本上,您希望隐藏构建过程的细节。由于您没有子类,因此具有 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)的东西。

【讨论】:

  • 是的,私有构造函数是这里的关键。
  • 这正是我想要的。示例非常接近我的问题。希望当我改变我的接受时没有人被冒犯。
【解决方案2】:

创建子类将取决于您的需要。基本上,如果您需要在某些方面有所不同的行为,请继续使用工厂创建子类。

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

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

【讨论】:

  • 感谢您的回答和链接。所有对象必须具有完全相同的行为和相同的属性。只有这些属性的值是不同的、定义的集合。老实说,我不理解传递类型字符串并返回类的已定义对象的静态创建方法的缺点。不过我想我会检查原型。
  • 强烈反对。这些只是能够构造对象的 3 种随机设计模式。答案没有给出真正的解释,为什么他们中的任何一个都有助于解决手头的问题。 OP,请使用类似静态成员的答案,但也要将构造函数设为私有,然后编译器+语言将为您完成工作,而不是无缘无故地编写一堆代码
猜你喜欢
  • 2016-12-02
  • 1970-01-01
  • 2020-04-21
  • 2022-11-12
  • 1970-01-01
  • 2013-07-28
  • 2020-09-30
  • 1970-01-01
  • 2022-01-17
相关资源
最近更新 更多