user not logged
← Previous page Next page →

Шаблон "Абстрактная Фабрика".

Design Patterns
Author:Анатолий Тутов Timestamp:27 / 10 / 2006 @ 18:06:00
Tags: creational patterns, object-oriented design, programming

Абстрактная Фабрика (The Abstract Factory).

Этот шаблон на одну ступень выше шаблона Фабрика по уровню абстракции.Он может быть использован, если необходимо вернуть объект одного из нескольких «родственных» классов,каждый из которых может возвращать различные объекты по запросу.Инными словами Абстрактная Фабрика может возвращать один из нескольких классов-Фабрик. Одним из главных назначений Абстрактной Фабрики является то, что она изолирует конкретные классы,объекты которых создаются. Имена этих классов скрыты в АФ и совершенно не нужны на клиентском уровне. Благодаря такой изоляции, можно легко заменять или изменять эти семейства классов. В дальнейшем, при создании объектов, этот механизм убережет вас от неявного использования классов принадлежащих к другим семействам. Некоторую сложность будет представлять только добавление нового семейства, поскольку потребуется доопределить новые условия, которые должны вызывать создание объектов этого семейства.

Так как все классы, генерируемые Абстрактной Фабрикой, имеют один базовый класс, невозможно предотвратить отличия в составе методов этих классов. Возникает традиционная проблема наследования: невозможно сказать, доступен ли тот или иной метод, пока не ясно, к какому классу относится используемый объект. Решения проблемы так же традиционны: либо определить все методы в базовом классе, даже если они не будут ничего делать,либо проверять экземпляр на принадлежность к тому или инному классу посредством динамического приведения типов. Пример Данный пример показывает часть реализации программы — справочника по планировке садов. Задача этой программы определять оптимальное распределение для различных видов растений в различных видах садов. Класс Garden(Сад) — это Фабрика объектов Plant(Растение). В нем определены 3 абстрактных метода, для получения объектов Plant, каждый метод соответствует расположению в определенной части сада. Из наследников Garden в данном примере приведен только класс VegieGarden(Плодовый сад), возвращающий объекты Plant с конкретными именами растений. Предполагается наличие аналогичных классов PerennialGarden(Многолетний сад) и Annual Garden(Однолетний сад). Класс Plant в данном варианте просто возвращает имя, с которым был создан объект. В реальной системе подкласс класса Garden может, например, обращаться к базе данных растений, для получения соответствующих сведений. Примером Абстрактной Фабрики в данном случае является класс GardenMaker(Генератор садов). В зависимости от текстового параметра метода getGarden он возвращает тот или иной объект класса унаследованного от Garden. А из этого объекта уже можно получить объект класса Plant.

public abstract class Garden 
{
   public abstract Plant getCenter();
   public abstract Plant getBorder();
   public abstract Plant getShade();
}

public class Plant 
{
   String name;
   public Plant(String pname) 
   {
      name = pname; //save name
   }
   public String getName() 
   {
      return name;
   }
}

public class VegieGarden extends Garden 
{
   public Plant getShade() 
   { 
      return new Plant(«Broccoli»);
   }
   public Plant getCenter() 
   {
       return new Plant(«Corn»);
   }
   public Plant getBorder() 
   {
       return new Plant(«Peas»);
   }
}

class GardenMaker
{
    //Abstract Factory which returns one of three gardens 28
   private Garden gd;
   public Garden getGarden(String gtype)
   {
      gd = new VegieGarden(); //default
      if(gtype.equals(«Perennial»))
         gd = new PerennialGarden();
       if(gtype.equals(«Annual»))
         gd = new AnnualGarden();
      return gd;
   }
}

Использовать эти классы можно, например, так:

Garden garden = new GardenMaker().getGarden(strGardenType);
Plant centerPlant = garden.getCenter().getName();
Plant borderPlant = garden.getBorder().getName();
Plant shadePlant = garden.getShade().getName();

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

Add new comment

Your name:
*Email:
Homepage:
Subject:
*Comment:
 
* denotes required field
← Previous page Next page →

Where am I?

This is an individual post page where its content and comments are located.

Powered by: Motoko Blog System 0.9.5 beta | Used theme: Proximity One
Page generation time: 0.22 s | SQL requests number: 7 | Timestamp: 05:09:24, 23-02-2012
May the force be with you