Шаблоны. Порождающие

С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