2024-10-05 09:30:14 +03:00
|
|
|
|
/*
|
2025-05-12 03:44:31 +03:00
|
|
|
|
* Author: Nikolay Dvurechensky
|
|
|
|
|
* Site: https://www.dvurechensky.pro/
|
|
|
|
|
* Gmail: dvurechenskysoft@gmail.com
|
|
|
|
|
* Last Updated: 12 мая 2025 03:39:52
|
|
|
|
|
* Version: 1.0.4
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
/*
|
2024-10-05 09:30:14 +03:00
|
|
|
|
* ПОРОЖДАЮЩИЕ ПАТТЕРНЫ
|
|
|
|
|
*
|
|
|
|
|
* Глава_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();
|
|
|
|
|
}
|
|
|
|
|
}
|