2014-12-12 9 views
1

Я пытаюсь реализовать класс, который может иметь только определенный набор объектов. Очевидно, что эти объекты имеют все те же свойства, но отличаются только значениями этих свойств.
В качестве примера подумайте о классе автомобиля. Он имеет имя свойства и ps. Должно быть (только) возможно создать следующие объекты:Определение «типов» объектов

  • автомобиль с именем: «Porsche», PS: 350;
  • автомобиль с именем: 'BMW', PS: 250;

Невозможно инициализировать, т. Е. Автомобиль с именем: «Porsche», PS: 500; Этот список может меняться или расширяться при продолжении кодирования.

Является ли хорошей идеей для создания типов в качестве подклассов автомобиля, задавая его значения в конструкторе? Или было бы разумно настроить какой-то шаблон фабрики/создателя?

Большое спасибо за ваши идеи
Саймон

+1

Классический шаблон здесь - фабрика –

ответ

0

В принципе, вы хотите скрыть детали процесса строительства. Поскольку у вас нет подклассов, решения GoF с Factory, Prototype и Builder, вероятно, являются чрезмерно продуманными.

Я решил эту проблему в 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).

+0

Да, частный конструктор здесь. – japreiss

+0

Это именно то, что я искал. Пример очень близок к моей проблеме. Надеюсь, никто не обидится, когда я изменю свое согласие. – Simon

0

Для создания подклассов будет зависеть от ваших потребностей. В принципе, если вам нужно поведение, которое каким-то образом отличается, и продолжайте создавать подклассы с помощью Factory.

Если вам просто нужно заполнить автомобиль знаками, которые зависят от других значений, вы можете использовать Builder pattern.

Если ваши объекты являются конкретными, и вам просто нужно начать с своего рода шаблона, используйте Prototype.

+0

Thx для вашего ответа и ссылок. Все объекты должны иметь точно такое же поведение и те же свойства. Только значения этих свойств различны, определенные множества. Честно говоря, я не понимаю недостаток статического метода create, который получает строку типа и возвращает определенный объект класса. Тем не менее, я думаю, что проверю прототип. – Simon

+0

не согласен сильно. это всего лишь 3 случайных шаблона проектирования, которые могут создавать объекты. ответ не дает реального объяснения, почему кто-либо из них помогает в решении этой проблемы.OP, пожалуйста, используйте что-то вроде ответа со статическими членами, но также сделайте конструктор закрытым, тогда язык компилятора + сделает для вас работу, а не писать кучу кода без причины. – japreiss

Смежные вопросы