C# Абстрактна фабрика (Abstract Factory)

2075 / C# / Шаблони / Абстрактна фабрика (Abstract Factory)

Дає змогу створювати сімейства пов’язаних об’єктів, не прив’язуючись до конкретних класів створюваних об’єктів.

Об'єднує фабричні методи у сімейство взаємопов'язаних об'єктів

 

public static void Main()
{
  // Abstract factory #1
  AbstractFactory factory1 = new ConcreteFactory1();
  Client client1 = new Client(factory1);
  client1.Run();
  // Abstract factory #2
  AbstractFactory factory2 = new ConcreteFactory2();
  Client client2 = new Client(factory2);
  client2.Run();
  Console.ReadKey();
}


abstract class AbstractFactory
{
  public abstract AbstractProductA CreateProductA();
  public abstract AbstractProductB CreateProductB();
}

class ConcreteFactory1 : AbstractFactory
{
  public override AbstractProductA CreateProductA()
  {
    return new ProductA1();
  }
  public override AbstractProductB CreateProductB()
  {
    return new ProductB1();
  }
}

class ConcreteFactory2 : AbstractFactory
{
  public override AbstractProductA CreateProductA()
  {
    return new ProductA2();
  }
  public override AbstractProductB CreateProductB()
  {
    return new ProductB2();
  }
}

abstract class AbstractProductA
{
}

abstract class AbstractProductB
{
  public abstract void Interact(AbstractProductA a);
}

class ProductA1 : AbstractProductA
{
}

class ProductB1 : AbstractProductB
{
  public override void Interact(AbstractProductA a)
  {
    Console.WriteLine(this.GetType().Name +
    " interacts with " + a.GetType().Name);
  }
}

class ProductA2 : AbstractProductA
{
}

class ProductB2 : AbstractProductB
{
  public override void Interact(AbstractProductA a)
  {
    Console.WriteLine(this.GetType().Name +
    " interacts with " + a.GetType().Name);
  }
}

class Client
{
  private AbstractProductA abstractProductA;
  private AbstractProductB abstractProductB;

  public Client(AbstractFactory factory)
  {
    abstractProductB = factory.CreateProductB();
    abstractProductA = factory.CreateProductA();
  }
  public void Run()
  {
    abstractProductB.Interact(_abstractProductA);
  }
}

 

ProductB1 interacts with ProductA1
ProductB2 interacts with ProductA2