2015-11-04 6 views
1

Я вижу, что многие люди используют что-то вроде этого и называют его Factory pattern.Варианты реализации шаблона фабрики

class Factory { 
    public IProduct Create (ProductEnum type) { 
     switch (type) { 
      case ProductAType: 
       return new ProductA(); 
      case ProductBType: 
       return new ProductB(); 
     } 
    } 
} 

Но разве не существует заводской шаблон, где у вас есть одна фабрика для каждого типа продукта? Поэтому, когда вы создаете новую реализацию IProduct, вам нужно создать новый заводский класс и переопределить метод Create. Нечто подобное в этой картине:

enter image description here

Является первым примером также завод шаблон или это что-то другое, и это должно быть использовано или нет?

+0

шаблоны редко используются в «сырой» (стандартной) форме – Andrew

+0

Чтобы устранить путаницу в именах, см. Этот ответ: http://stackoverflow.com/a/32783880/1168342 – Fuhrmanator

ответ

1

Но не настоящий ли заводский шаблон, где у вас есть одна фабрика для каждого типа продукта?

Если на "реальный образец завода" вы имеете в виду GoF Factory Method модель, то да: картина GoF утверждает, что "подклассы решить, какой класс инстанцировать."

Является первым примером также Factory Factory или это что-то еще,

Первый пример - это не шаблон GoF, но он обычно используется и обычно называется фабрикой. Вы также можете увидеть, что он называется Simple Factory, или если метод является статическим, Static Factory, чтобы отличить его от GoF. Замешательство неумолимо, когда различия не производятся между шаблонами GoF и связанными (но неофициальными) иконами кодирования.

и должен ли он использоваться или нет?

Причина, по которой вы не увидите подобную идиому в шаблонах GoF, заключается в том, что она нарушает open/closed principle. Один и тот же заводский класс должен быть изменен каждый раз, когда добавляется новый продукт, вместо добавления продуктов через наследование & полиморфизм на GoF. Вы сами должны судить о том, превосходит ли простота нарушение открытого/закрытого принципа потенциальная ремонтопригодность.

+0

Что касается OCP: метод Factory также нарушает принцип открытого/закрытого использования, используя те же аргументы, которые вы здесь имеете. Новый заводский класс должен быть добавлен * каждый раз при добавлении нового продукта. Кроме того, шаблон Singleton имеет мало или ничего общего с OCP, но он был в книге GoF. Кроме того, не будет ли [простой завод, использующий отражение] (http://stackoverflow.com/q/30376353/1168342) также уважать OCP? Я использую ту часть определения, которая заявляет, что она позволяет продлить действие программы без изменения ее исходного кода. – Fuhrmanator

+1

Спасибо за три комментария. ** 1. ** Добавление нового класса фабрики (через подклассирование) было бы типичным примером подчинения OCP: существующая фабрика остается нетронутой, т. Е. Открыта для расширения, закрыта для модификации. ** 2. ** В цитате из книги «Используйте шаблон Singleton, когда единственный экземпляр должен быть расширяемым путем подкласса», который говорит, что singleton должен быть Open для расширения. ** 3. ** Да, отражение, безусловно, может быть использовано для удовлетворения OCP. GoF фокусируется на композиции и полиморфизме. Я не помню ни одного из их узоров, упоминающих отражение. – jaco0646

1

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

Что у вас есть в фрагменте кода заводской метод.

+0

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

+0

Фрагмент кода не является заводским методом. Метод фабрики основан на наследовании, на GoF.В дополнение к двум фабричным шаблонам GoF существуют и другие, вырожденные версии (которые по моему опыту более распространены). Этот фрагмент является одной из тех других версий. – jaco0646

+0

@ jaco0646 Шаблоны - это только предложения, они не говорят вам, как должен выглядеть ваш код, но как он должен себя вести. Нет ничего похожего на дегенеративные варианты шаблонов. Это единственное определение шаблона слова. –