Шаблоны. Порождающие
Сreational patterns
Абстрактная фабрика
Сначала создадим абстрактную фабрику CarFactory, содержащую семейство из двух объектов — автомобиля и двигателя для него.
abstract class CarFactory { public abstract AbstractCar CreateCar(); public abstract AbstractEngine CreateEngine(); }
В результате у нас появился абстрактный класс с двумя методами, обеспечивающими получение соответствующих абстрактных объектов. Теперь реализуем первую конкретную фабрику, создающую класс, описывающий автомобиль BMW и двигатель для него:
class BMWFactory : CarFactory { public override AbstractCar CreateCar() { return new BMWCar(); } public override AbstractEngine CreateEngine() { return new BMWEngine(); } }
Сделаем то же самое для автомобиля марки Audi, чтобы у нас возникла вторая конкретная фабрика:
class AudiFactory : CarFactory { public override AbstractCar CreateCar() { return new AudiCar(); } public override AbstractEngine CreateEngine() { return new AudiEngine(); } }
Теперь опишем абстрактный класс для наших автомобилей. В данном случае у них будет один метод, позволяющий узнать максимальную скорость машины. С его помощью мы обратимся и ко второму объекту — двигателю:
abstract class AbstractCar { public abstract void MaxSpeed(AbstractEngine engine); }
Все двигатели, в свою очередь, будут содержать один параметр — максимальную скорость. Эта простая общедоступная переменная позволит сократить объем программы в данном примере:
abstract class AbstractEngine { public int max_speed; }
Реализуем класс для автомобиля BMW:
class BMWCar : AbstractCar { public override void MaxSpeed(AbstractEngine engine) { Console.WriteLine(«Макcимальная скорость: « + engine.max_speed.ToString()); } }
А затем определяем параметры его двигателя:
class BMWEngine : AbstractEngine { public BMWEngine() { max_speed = 200; } }
Проделаем то же самое для класса, описывающего автомобиль Audi:
class AudiCar : AbstractCar { public override void MaxSpeed(AbstractEngine engine) { Console.WriteLine(«Макcимальная скорость: « + engine.max_speed.ToString()); } }
Задаем двигатель для него:
class AudiEngine : AbstractEngine { public AudiEngine() { max_speed = 180; } }
Теперь мы создадим класс Client, где покажем, как осуществляется работа с абстрактной фабрикой. В конструктор такого класса будут передаваться все конкретные фабрики, которые и начнут создавать объекты автомобиль и двигатель. Следовательно, в конструктор класса Client допустимо передать любую конкретную фабрику, работающую с любыми марками автомобилей. А метод Run позволит узнать максимальную скорость конкретной машины.
class Client { private AbstractCar abstractCar; private AbstractEngine abstractEngine;
public Client(CarFactory car_factory) { abstractCar = car_factory.CreateCar(); abstractEngine = car_factory.CreateEngine (); } public void Run() { abstractCar.MaxSpeed(abstractEngine); } }
Ниже показано, как вызвать метод Run с различными параметрами:
public static void Main() { // Абстрактная фабрика № 1 CarFactory bmw_car = new BMWFactory (); Client c1 = new Client(bmw_car); c1.Run();
// Абстрактная фабрика № 2 CarFactory audi_factory = new AudiFactory(); Client c2 = new Client(audi_factory); c2.Run(); Console.Read(); }
Строитель
Фабричный метод
Прототип
Одиночка
Last updated