Вопросы относительно фабричного образца - PullRequest
7 голосов
/ 26 августа 2011

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

Метод фабрики : - Класс указывает свои подклассы, чтобы указать, какие объекты для создания на основе некоторого параметра. Итак, мы ожидаем здесь некоторые абстрактный метод в базовом классе, который будет реализован ребенком Класс и цель этого будет создать некоторый объект

Абстрактная фабрика : - Предоставляет фабрику (в форме интерфейса или абстрактная фабрика) для создания семейств связанных или зависимых объектов без указания их конкретных классов.

У меня здесь вопрос о том, что они подразумевают под семьей зависимых или связанных объекты. Давайте обратимся к http://www.apwebco.com/gofpatterns/creational/AbstractFactory.html. Насколько я понимаю, это означает, что в FinancialToolsFactory (в ссылке) можно создать TaxProcessor, который является семейством продуктов, где фактически все продукты являются CanadaTaxProcessor и EuropeTaxProcessor. Таким образом, здесь у нас будет n число конкретных фабрик (в данном случае CanadaFinancialToolsFactory и EuropeFinancialToolsFactory), которые будут расширять / реализовывать абстрактную фабрику в этом случае FinancialToolsFactory.

Пожалуйста, дайте мне знать, если вышеприведенное понимание верно, поскольку я думаю, что это суть модели Фабрики.

Второй вопрос:

Ниже показано, что делают люди с названием фабричного образца:

public class MyFactory
{
    public static <T> T getObject(Class<T> cls)
    {
        if (cls == null)
        {
            throw new IllegalArgumentException("Invalid className");
        }

        T daoObject = (T)map.get(cls);

        if (daoObject == null)
        {
            daoObject = loadObject(cls);
        }

        return daoObject;
    }
}

Они просто передают класс наподобие Example.class из метода main и получают экземпляр объекта для этого конкретного класса. Теперь, если мы пойдем по фактическому понятию фабричного шаблона, который описан в начале (из первой книги), и другим веб-сайтам, это не будет следовать ни одному из двух фабричных шаблонов. Для меня это выглядит как служебный класс, где мы передаем класс и получаем экземпляр объекта. Пожалуйста, дайте мне знать, если вы, ребята, согласны с этим?

Ответы [ 2 ]

7 голосов
/ 26 августа 2011

Ваше понимание шаблонов Factory Method и Abstract Factory правильное.

Когда люди создают классы, в обязанности которых входит исключительно создание других объектов, они, естественно, склонны называть их Factory.Это само по себе не является необоснованным.Проблема в том, что нет фабричного шаблона .

Здесь возникает путаница по двум причинам:

  • Некоторые разработчики просто хотят добавить другой шаблони утверждают, что они используют «Фабричный шаблон», ссылаясь на объект, который создает другие

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

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

2 голосов
/ 26 августа 2011

что они подразумевают под семейством зависимых или связанных объектов

Используя пример из Design Patterns Банды Четырех:

  • AbstractFactory (WidgetFactory)
  • ConcreteFactory (MotifWidgetFactory, PMWidgetFactory)
  • AbstractProduct (Window, ScrollBar)
  • ConcreteProduct (MotifWindow, MotifScrollBar, PMWindow, PMScrollBar)

public abstract class WidgetFactory {...}

public class MotifWidgetFactory extends WidgetFactory {...}

public class PMWidgetFactory extends WidgetFactory {...}

Давайте начнем с MotifWidgetFactory.Он будет производить семейство конкретных продуктов, которые расширяют или реализуют абстрактные продукты.Так как все они построены на одном заводе, они играют вместе.Вы не можете заставить PMScrollBar работать с MotifWindow.

Ниже показано, что люди делают с именем фабричного образца ... это похоже на служебный класс, где мы находимсяпередача класса и получение экземпляра объекта.

Ваш пример - фабрика, в которой он производит объект.В этом случае извлекаем синглтон из Map.Он не следует шаблонам «фабричного метода» или «абстрактной фабрики» и поэтому является только фабрикой по названию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...