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

Фабричный метод

порождающий шаблон проектирования, предоставляющий подклассам интерфейс для создания экземпляров некоторого класса. В момент создания наследники могут определить, какой класс создавать. Иными словами, Фабрика делегирует создание объектов наследникам родительского класса. Это позволяет использовать в коде программы не специфические классы, а манипулировать абстрактными объектами на более высоком уровне. Также известен под названием виртуальный конструктор.

Плюсы
  • позволяет сделать код создания объектов более универсальным, не привязываясь к конкретным классам, а оперируя лишь общим интерфейсом
  • позволяет установить связь между параллельными иерархиями классов

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

  • Применяемость
  • классу заранее известно, объекты каких подклассов ему нужно создавать
  • класс спроектирован так, чтобы объекты, которые он создает, специфицировались подклассами
  • класс делегирует свои обязанности одному из нескольких вспомогательных подклассов, и планируется локализовать знание о том, какой класс принимает эти обязанности на себя
  • program FactoryMethod;
    uses SysUtils;
    type
      TProduct = class
      public
        procedure GetName: string; virtual; abstract;
      end;
    
      TConcreteProductA = class(TProduct)
      public
        function GetName: string; override;
      end;
      
      TConcreteProductB = class(TProduct)
      public
        function GetName: string; override;
      end;
      
      TCreator = class
      public
        function FactoryMethod: TProduct; virtual; abstract;
      end;
    
      TConcreteCreatorA = class(TCreator)
      public
        function FactoryMethod: TProduct; override;  
      end;
    
      TConcreteCreatorB = class(TCreator)
      public
        function FactoryMethod: TProduct; override;
      end;
    
    function TConcreteCreatorA.FactoryMethod: TProduct;
    begin
      Result := TConcreteProductA.Create;
    end;
    
    function TConcreteCreatorB.FactoryMethod: TProduct;
    begin
      Result := TConcreteProductB.Create;
    end;
    
    var
      Creators: array[1..2] of TCreator;
      Product: TProduct;
      i: integer;
    begin
      Creators[1] := TConcreteCreatorA.Create;
      Creators[2] := TConcreteCreatorB.Create;
    
      for i := 1 to 2 do
      begin
        Product := Creators[i].FactoryMethod;
        writeln(Product.GetName());
        Product.Free();
      end;
    
      for i := 1 to 2 do
        Creators[i].Free;
    end.
    

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

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