PatternsCSharpExtraAddons/Patterns/Pattern_2-Абстрактная фабрика(Abstract Factory)/Program.cs
Dvurechensky a4cd4b4ced 1.0
Main
2024-10-05 09:30:14 +03:00

129 lines
2.8 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* ПОРОЖДАЮЩИЕ ПАТТЕРНЫ
*
* Глава_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();
}
}