понедельник, 16 апреля 2012 г.

Абстрактная фабрика

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

Плюсы
  • изолирует конкретные классы
  • упрощает замену семейств продуктов
  • гарантирует сочетаемость продуктов

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

  • Применяемость
  • система не должна зависеть от того, как создаются, компонуются и представляются входящие в нее объекты
  • входящие в семейство взаимосвязанные объекты должны использоваться вместе и вам необходимо обеспечить выполнение этого ограничения
  • система должна конфигурироваться одним из семейств составляющих ее объектов
  • требуется предоставить библиотеку объектов, раскрывая только их интерфейсы, но не реализацию
  • program AbstractFactory;
    uses SysUtils;
    type
      ICar = class
      public
        procedure PrintName(); virtual; abstract;
      end;
      
      Ford = class(ICar)
      public
        procedure PrintName(); override;
      end;
    
      Toyota = class(ICar)
      public
        procedure PrintName(); override;
      end;
    
      IEngine = class
      public
        procedure PrintPower(); virtual; abstract;
      end;
    
      FordEngine = class(IEngine)
      public
        procedure PrintPower(); override;
      end;
    
      ToyotaEngine = class(IEngine)
      public
        procedure PrintPower(); override;
      end;
    
      ICarFactory = class
      public
        function CreateCar(): ICar; virtual; abstract;
        function CreateEngine(): IEngine; virtual; abstract;
      end;
    
      FordFactory = class(ICarFactory)
      public
        function CreateCar(): ICar; override;
        function CreateEngine(): IEngine; override;
      end;
    
      ToyotaFactory = class(ICarFactory)
      public
        function CreateCar(): ICar; override;
        function CreateEngine(): IEngine; override;
      end;
    
    
    function FordFactory.CreateCar: ICar;
    begin
      Result := Ford.Create;
    end;  
    
    function FordFactory.CreateEngine: IEngine;
    begin
      Result := FordEngine.Create;
    end;
    
    function ToyotaFactory.CreateCar: ICar;
    begin
      Result := Toyota.Create;
    end;
    
    function ToyotaFactory.CreateEngine: IEngine;
    begin
      Result := ToyotaEngine.Create;
    end;
    
    procedure use(f: ICarFactory);
    var
      c: ICar;
      e: IEngine;
    begin
      c := f.CreateCar();
      e := f.CreateEngine();
      c.PrintName();
      e.PrintPower();
      c.Free();
      e.Free();
    end;
    
    var
      aToyotaFactory: ToyotaFactory;
      aFordFactory: FordFactory;
    begin
      aToyotaFactory := ToyotaFactory.Create;
      aFordFactory := FordFactory.Create;
      use(aToyotaFactory);
      use(aFordFactory);
      aToyotaFactory.Free();
      aFordFactory.Free();
    end;
    

    Комментариев нет:

    Отправить комментарий