Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
!Шпора по ООПиП (3).docx
Скачиваний:
35
Добавлен:
22.09.2019
Размер:
2.31 Mб
Скачать

71. Абстрактная фабрика (шаблон проектирования)

Абстрактная фабрика (англ. Abstract factory)порождающий шаблон проектирования, позволяющий изменять поведение системы, варьируя создаваемые объекты, при этом сохраняя интерфейсы. Он позволяет создавать целые группы взаимосвязанных объектов, которые, будучи созданными одной фабрикой, реализуют общее поведение. Шаблон реализуется созданием абстрактного класса Factory, который представляет собой интерфейс для создания компонентов системы (например, для оконного интерфейса он может создавать окна и кнопки). Затем пишутся наследующиеся от него классы, реализующие этот интерфейс.

Цель

Предоставляет интерфейс для создания семейств взаимосвязанных или взаимозависимых объектов, не специфицируя их конкретных классов.

Плюсы

  • изолирует конкретные классы;

  • упрощает замену семейств продуктов;

  • гарантирует сочетаемость продуктов.

Минусы

  • сложно добавить поддержку нового вида продуктов.

Применимость

  • Система не должна зависеть от того, как создаются, компонуются и представляются входящие в нее объекты.

  • Входящие в семейство взаимосвязанные объекты должны использоваться вместе и вам необходимо обеспечить выполнение этого ограничения.

  • Система должна конфигурироваться одним из семейств составляющих ее объектов.

  • Требуется предоставить библиотеку объектов, раскрывая только их интерфейсы, но не реализацию.

// Abstract Factory pattern -- Real World example

using System;

 

namespace DoFactory.GangOfFour.Abstract.RealWorld

{

  /// MainApp startup class for Real-World

  /// Abstract Factory Design Pattern.

  class MainApp

  {

    /// Entry point into console application.

    public static void Main()

    {

      // Create and run the African animal world

      ContinentFactory africa = new AfricaFactory();

      AnimalWorld world = new AnimalWorld(africa);

      world.RunFoodChain();

 

      // Create and run the American animal world

      ContinentFactory america = new AmericaFactory();

      world = new AnimalWorld(america);

      world.RunFoodChain();

 

      // Wait for user input

      Console.ReadKey();

    }

  } 

 

  /// The 'AbstractFactory' abstract class

   abstract class ContinentFactory

  {

    public abstract Herbivore CreateHerbivore();

    public abstract Carnivore CreateCarnivore();

  }

 

  /// The 'ConcreteFactory1' class

  class AfricaFactory : ContinentFactory

  {

    public override Herbivore CreateHerbivore()

    {

      return new Wildebeest();

    }

    public override Carnivore CreateCarnivore()

    {

      return new Lion();

    }

  }

 

  /// The 'ConcreteFactory2' class

   class AmericaFactory : ContinentFactory

  {

    public override Herbivore CreateHerbivore()

    {

      return new Bison();

    }

    public override Carnivore CreateCarnivore()

    {

      return new Wolf();

    }

  }

 

  /// The 'AbstractProductA' abstract class

  abstract class Herbivore

  {

  }

 

  /// The 'AbstractProductB' abstract class

  abstract class Carnivore

  {

    public abstract void Eat(Herbivore h);

  }

 

  /// The 'ProductA1' class

  class Wildebeest : Herbivore

  {

  }

 

    /// The 'ProductB1' class

  class Lion : Carnivore

  {

    public override void Eat(Herbivore h)

    {

      // Eat Wildebeest

      Console.WriteLine(this.GetType().Name +

        " eats " + h.GetType().Name);

    }

  }

 

    /// The 'ProductA2' class

  class Bison : Herbivore

  {

  }

 

  /// The 'ProductB2' class

  class Wolf : Carnivore

  {

    public override void Eat(Herbivore h)

    {

      // Eat Bison

      Console.WriteLine(this.GetType().Name +

        " eats " + h.GetType().Name);

    }

  }

 

  /// The 'Client' class

  class AnimalWorld

  {

    private Herbivore _herbivore;

    private Carnivore _carnivore;

 

    // Constructor

    public AnimalWorld(ContinentFactory factory)

    {

      _carnivore = factory.CreateCarnivore();

      _herbivore = factory.CreateHerbivore();

    }

 

    public void RunFoodChain()

    {

      _carnivore.Eat(_herbivore);

    }

  }

}

Output

Lion eats Wildebeest Wolf eats Bison