/* * ПОРОЖДАЮЩИЕ ПАТТЕРНЫ * * Глава_9: Абстрактная фабрика (Abstract Factory) * * - скрыть сложную логику инициализации * - упростить поддержку функционала и его дополнение * (крайне рекдо используется) */ using BenchmarkDotNet.Attributes; /// /// Фабрика /// interface ICar { void Drive(); } class RacingCar : ICar { public void Drive() => Console.WriteLine("Ты на гоночном болиде едешь!"); } class ConcreteCar : ICar { public void Drive() => Console.WriteLine("Ты на бетономешалке едешь!"); } class UnknownCar : ICar { public void Drive() => Console.WriteLine("Ты на неизвестном едешь!"); } enum TypeCar { Truck, Racing } class CarFactory { public static ICar ProductCar(TypeCar type) { switch (type) { case TypeCar.Truck: return new RacingCar(); case TypeCar.Racing: return new ConcreteCar(); default: return new UnknownCar(); } } } [MemoryDiagnoser] [RankColumn] public class Benchmark { [Benchmark] public void ArrayListBench() { CarFactory.ProductCar(TypeCar.Truck).Drive(); } [Benchmark] public void ListBench() { var test = CarFactory.ProductCar(TypeCar.Truck); test.Drive(); } } /// /// Абстрактная фабрика /// interface ICarFactory { ICar ProductCar(TypeCar type); } class CarFactory_abstr : ICarFactory { public ICar ProductCar(TypeCar type) { switch (type) { case TypeCar.Truck: return new ConcreteCar(); case TypeCar.Racing: return new RacingCar(); default: return new UnknownCar(); } } } class TuningCarFactory_abstr : ICarFactory { public ICar ProductCar(TypeCar type) { switch (type) { case TypeCar.Truck: return new ConcreteCar(); case TypeCar.Racing: return new RacingCar(); default: return new UnknownCar(); } } } class AbstractFactory { public static ICarFactory GetFactory(bool tuning) => tuning ? new TuningCarFactory_abstr() : new CarFactory_abstr(); } class Program { public static void Main(string[] args) { //BenchmarkSwitcher.FromAssembly(typeof(Program).Assembly).Run(args); CarFactory.ProductCar(TypeCar.Truck).Drive(); CarFactory.ProductCar(TypeCar.Racing).Drive(); CarFactory.ProductCar((TypeCar)4).Drive(); AbstractFactory.GetFactory(true).ProductCar(TypeCar.Truck).Drive(); var factory = AbstractFactory.GetFactory(false); ICar car = factory.ProductCar(TypeCar.Racing); car.Drive(); } }