2015-04-11 3 views
0

Я работаю над приложением на C# Visual Studio '13, и я просто нажму кирпичную панель - новичок кирпичной кладкой. У меня есть класс - скажем, это класс автомобилей. Это не так, но это достойный пример для этого вопроса.Создание экземпляров класса с различными шаблонами предустановок

Теперь я хотел бы создать - я не уверен, что это правильная терминология - шаблоны, из которых я бы хотел создавать экземпляры. Эти созданные экземпляры будут сохранены в объекте List<Car>.

Давайте просто скажем, что класс автомобиля имеет название, год выпуска и атрибуты пробега. Я хотел бы иметь возможность создать шаблон, где я могу вызвать конструктор для создания автомобиля с заданным именем и модельным годом, но рандомизированный пробег - и у вас есть несколько разных. Может быть, использовать его в конструкторе таким образом, что у меня есть несколько наборов пресетов - или шаблонов - например. '99 BMW, '03 Merc и '79 Lada. Когда я вызываю конструктор, я бы хотел, чтобы он взял один из этих шаблонов и добавил случайный пробег.

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

+1

Вы не «делаете шаблоны в конструкторе», вы пишете класс CarFactory. И, возможно, класс CarTemplate. –

ответ

2

Одним из самых простых решений для некоторых жестко запрограммированных предопределенных значений экземпляра является factory pattern. Для следующего Car класса:

public class Car 
{ 
    public string Model { get; private set; } 
    public int Year { get; private set; } 
    public Color Color { get; private set; } 
    public int Mileage { get; private set; } 

    // ... 

    public Car(string model, int year, Color color, int mileage) 
    { 
     Model = model; 
     Year = year; 
     Color = color; 
     Mileage = mileage; 
    } 
} 

вы можете создать CarFactory как предложено Henk Holterman в его comment. Например:

public class CarFactory 
{ 
    public CarFactory() 
    { 
     random = new Random(); 
    } 

    public Car CreateBMW99WithRandomMileage(Color color) 
    { 
     return new Car("BMW", 1999, color, random.Next()); 
    } 

    public Car Create03BlackMerc(int mileage) 
    { 
     return new Car("Mercedes", 2003, Colors.Black, mileage); 
    } 

    public Car Create79Lada(Color color, int mileage) 
    { 
     return new Car("Lada", 1979, color, mileage); 
    } 

    // ... 

    private Random random; 
} 

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

Другое, похоже, образец, который вы можете использовать здесь, это prototype pattern.

Вот как вы можете объединить эти две модели, чтобы создать случайный автомобиль:

public class CarFactory 
{ 
    public CarFactory() 
    { 
     random = new Random(); 
     black99BMW = new Car("BMW", 1999, Colors.Black, 0); 
     black03Merc = new Car("Mercedes", 2003, Colors.Black, 0); 
     black79Lada = new Car("Lada", 1979, Colors.Black, 0); 

     // ... 

     allCars = new Car[] { black99BMW, black03Merc, black79Lada }; 
    } 

    public Car CreateBMW99WithRandomMileage(Color color) 
    { 
     return black99BMW.Clone(color, random.Next()); 
    } 

    public Car Create03BlackMerc(int mileage) 
    { 
     return black03Merc.Clone(Colors.Black, random.Next()); 
    } 

    public Car Create79Lada(Color color, int mileage) 
    { 
     return black79Lada.Clone(color, mileage); 
    } 

    public Car CreateRandomCar() 
    { 
     var index = random.Next(allCars.Length); 
     Color color = // pick random color 
     int mileage = random.Next(); 

     return allCars[index].Clone(color, mileage); 
    } 

    private Car black99BMW; 
    private Car black03Merc; 
    private Car black79Lada; 
    private Car[] allCars; 
} 

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

+0

Спасибо за быстрый ответ. Кажется, я думал о проблеме обратным образом - вместо очевидного способа использования конструкторов с фиксированными и случайными атрибутами. Заключительная часть, которую мне не хватает, как я могу определить, какой автомобиль создает CarFactory? Если я поставлю его в игровых терминах: есть случайная встреча, где игрок находит одну из трех машин в объекте CarFactory. Я ценю вашу помощь, хотя я постоянно чувствую, что мне просто не хватает чего-то очевидного. – MikaV84

+0

@ MikaV84 Я отредактировал ответ, ура! – BartoszKP

+0

О, человек, массивы. Конечно. Должен был знать, что это нечто очевидное. Я очень ценю время, которое вы приняли, чтобы ответить на все это. – MikaV84

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