129 lines
2.8 KiB
C#
129 lines
2.8 KiB
C#
|
/*
|
|||
|
* ПОРОЖДАЮЩИЕ ПАТТЕРНЫ
|
|||
|
*
|
|||
|
* Глава_9: Абстрактная фабрика (Abstract Factory)
|
|||
|
*
|
|||
|
* - скрыть сложную логику инициализации
|
|||
|
* - упростить поддержку функционала и его дополнение
|
|||
|
* (крайне рекдо используется)
|
|||
|
*/
|
|||
|
|
|||
|
using BenchmarkDotNet.Attributes;
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Фабрика
|
|||
|
/// </summary>
|
|||
|
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();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Абстрактная фабрика
|
|||
|
/// </summary>
|
|||
|
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();
|
|||
|
}
|
|||
|
}
|