2016-07-11 2 views
0

Хотя этот вопрос обсуждался много раз, я все еще нахожусь слишком смущенным.Этот код реализует «Заводской шаблон», заводские методы, оба или ничего?

У меня есть этот простой пример кода:

public class FruitFactory { 

    public static Apple getApple() { 
     return new Apple(); 
    } 

    public static Banana getBanana() { 
     return new Banana(); 
    } 

    public static Orange getOrange() { 
     return new Orange(); 
    } 
} 
  • Какой Factoryтип этот код? и является ли это правильной записью factory methods?
  • Определение фабрики картины: создать объект, не подвергая логику создания клиента

Если я разоблачить мой клиент некоторых сложностей создания вроде как на пример ниже, является его плохо заводская реализация?

public static Orange getOrange(String weight, String size,) { 
    return new Orange(weight, size); 
} 
+0

Можем ли мы увидеть внутреннюю работу трех классов фруктов? –

+0

см. [Шаблоны проектирования: заводская фабрика по заводскому методу] (http://stackoverflow.com/questions/4209791/design-patterns-abstract-factory-vs-factory-method) –

ответ

0

Как говорится, заводом является всего лишь абстракцией, где реализация создания объекта намеренно инкапсулированная за открытым интерфейсом завода. Фабрика не обязательно должна быть классом, она не должна быть пакетом - разные языки достигают инкапсуляции состояния и поведенческих данных по-разному (например, рассмотрим закрытие).

функция на языке, который позволяет функции «верхнего уровня», может быть завод, а также:

public Orange growNewOrange(String weight, String size) { 
    /// ...traditionally not callers concern. 
} 

Если завод скрывает код создания за способ для вас, чтобы использовать его, не интересуясь себя указанный код создания для каждого созданного объекта, у вас уже есть полезная изоляция (между получением новых объектов и тем, что ими управляет), которая решает проблему, которую был разработан для решения этой проблемы.

Есть заводы, предназначенные для создания и управления объектами одного вида, а затем есть те, которые создают и управляют несколькими видами объектов. Фруктовая фабрика, где вы можете указать конкретный класс фруктов, который вы хотите, по-прежнему соответствует действующей фабричной схеме.

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

Немедленно полезный совет будет заключаться в создании кода создания в пакете Java или классе, где задание параметров созданного объекта выполняется для каждого объекта, в то время как логика создания фабричного состояния - например, размер повторно используемого объекта пул и т. д. - создается во время создания фабрики. Пулы объектов являются одним из примеров заводского шаблона на работе.

+0

Ваше второе утверждение в 4-м абзаце («A фруктовый завод, где вы можете указать конкретный класс фруктов, который вы хотите, по-прежнему соответствует действующему заводскому шаблону. ») неверно на основе исходного определения:« Определить интерфейс для создания объекта, но пусть подклассы определяют, какой класс необходимо создать. Метод Factory позволяет создать экземпляр класса, который он использует для подклассов. »« –

+0

Вы правы - согласно первоначальному определению мое утверждение просто неверно. Я действительно думаю, что пулы объектов часто реализуются без малейшего вдохновения заводского шаблона, и там вам часто нужно указать тип объекта, который вы хотите явно. Несмотря на это, я не думаю, что мой ответ бесполезен, так как его текущий балл указывает, и думать, что я был человеком, который поддержал оба других ответа здесь :) – amn

1
  • Первый код - это шаблон Factory, потому что у вас есть только один класс без подкласса, переопределения и т. Д.

Если вы хотите использовать фабричный метод, чем писать (Banana наследуется от Fruit):

public abstract FruitFactory { 
    public abstract Fruit createFruit(); 
} 

public BananaFactory extends FruitFactory { 
    @Override 
    public Fruit createFruit() { 
     return new Banana(); 
    } 
} 

Реализация:

public static Orange getOrange(String weight, String size) { 
    return new Orange(weight, size); 
} 

также правильное применение на мой взгляд, потому что вы инкапсулировать логику создания, как описано в @amn.

Хорошая вещь в использовании метода static заключается в том, что вы можете сделать конструктор private, так что это возможно только для создания объектов с помощью метода.

Для лучшего понимания смотрите следующую ссылку: Цель patterns

1

фабричной модели является положить слой абстракции поверх создания объекта.

Если у объекта достаточно информации, чтобы создать себя без слишком большого количества аргументов или настроек, вам не нужно использовать фабричный шаблон, так как конструктор объекта сам по себе.

Это проблема с вашим текущим кодом, он не добавляет слой абстракции ни к чему. Вы просто инкапсулируете конструктор.

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

Edit:. Оригинальная Банда четыре описания

«Определить интерфейс для создания объекта, но пусть подклассы решить, какой класс инстанцировать Фабричный метод позволяет в классе Defer экземпляры он использует для подклассов. "

Это означает, что ваш код не является фабрикой, потому что вам нужно определить, что вам нужно.

+0

Вы слишком часто принимаете аналогию с деревом - объекты чаще всего нужны параметры, которые должны быть созданы, независимо от того, как вы их создаете. Завод не предназначен и не должен устранять необходимость в параметрах строительства объекта. Возможно, ваша аналогия может быть описана как красивая в некотором смысле, если бы не тот факт, что фабрика создает объекты для своих клиентов, тогда как реальное дерево создает плоды без какой-либо конкретной цели, следовательно, никаких параметров.Также количество параметров полностью ортогонально в решении использовать заводскую модель. – amn

+0

@amn Помещение слоя абстракции поверх чего-то не означает, что оно полностью устраняет необходимость в аргументах. Это просто означает, что он входит в некоторые из них автоматически. –

+0

Я не сказал, что он устраняет аргументы или должен, на самом деле я сказал, что это не так и не должно. Вне зависимости от того, входит ли он в некоторые из них, он не делает его фабрикой. Уровень абстракции, где * данные о создании * инкапсулированы ** делает ** сделать его фабрикой. Я никогда не говорил, что все абстракции - это фабрики. И вы не имеете в этом отношении, но в своем втором абзаце вы подразумеваете, что нет необходимости в фабриках, если у объекта достаточно информации для создания самого себя - это просто неверно. Последний абзац также не имеет ничего общего с заводами, как я объяснил в своем первом комментарии. – amn

Смежные вопросы