Абстрактный заводской узор
Введение
wiki: Шаблон абстрактной фабрики — это шаблон проектирования разработки программного обеспечения. Шаблон «Абстрактная фабрика» предоставляет способ инкапсулировать группу отдельных фабрик с одной и той же темой. При обычном использовании клиентская программа должна создать конкретную реализацию абстрактной фабрики, а затем использовать абстрактную фабрику в качестве интерфейса для создания конкретных объектов этого субъекта. Клиентской программе не нужно знать (или заботиться) о конкретном типе объектов, которые она получает из этих внутренних фабричных методов, потому что клиентская программа использует только универсальный интерфейс этих объектов. Шаблон абстрактной фабрики отделяет детали реализации набора объектов от их общего использования.
В предыдущей статье мы представили первые два вида фабричных шаблонов:
И сегодня я собираюсь представить抽象工厂模式
Это последний из фабричных шаблонов, и он является дополнением к первым двум шаблонам.
Фабричный шаблон используется для создания набора связанных или взаимозависимых объектов.Отличие от фабричного метода заключается в том, что фабричный метод нацелен на иерархию продуктов, а абстрактный фабричный шаблон нацелен на несколько структур уровня продукта. Мы можем думать об уровне продукта как о семействе продуктов.Так называемое семейство продуктов относится к семейству продуктов со связанными функциями, расположенными в разных структурах уровня продукта.
Код
или с工厂方法模式
В нашем примере продажи булочек:
В предыдущем фабричном методе необходимо открыть два магазина булочек в Ци и Гуандуне, затем необходимо реализовать две фабричные структуры из одного интерфейса фабрики.Магазин Циши и магазин Гуандун относятся к двум семействам продуктов: булочкам из свинины и трем свежим фаршам. булочки принадлежат к одной иерархической структуре.
Итак, в шаблон абстрактной фабрики мы хотим добавить две фабрики, каждая из которых реализует два метода создания продукта:
-
Заводской интерфейс и интерфейс продукта
type FactoryInterface interface { CreatePigMeatBuns() ProductInterface // 创建猪肉馅产品 Create3SBuns() ProductInterface // 创建三鲜馅产品 } type ProductInterface interface { Intro() }
-
Реализовать 4 продукта
type GDPigMeatBuns struct {
}
func (p GDPigMeatBuns) Intro() {
fmt.Println("广东猪肉馅包子")
}
// TODO ... 其他产品实现方法没区别... 就省略掉了,需要的话请去仓库里看源码
- фабрика по производству
// 齐市包子铺
type QSFactory struct {
}
func (qs QSFactory) CreatePigMeatBuns() ProductInterface {
return QSPigMeatBuns{}
}
func (qs QSFactory) Create3SBuns() ProductInterface {
return QS3SBuns{}
}
// 广东包子铺
type GDFactory struct {
}
func (gd GDFactory) CreatePigMeatBuns() ProductInterface {
return GDPigMeatBuns{}
}
func (gd GDFactory) Create3SBuns() ProductInterface {
return GD3SBuns{}
}
-
Это может быть создано с помощью абстрактной фабрики
var f FactoryInterface // 特意以这种方式声明,更好的体会抽象工厂模式的好处 f = new(QSFactory) b := f.CreatePigMeatBuns() b.Intro()
Преимущества и недостатки
-
Преимущества: Помимо преимуществ шаблона фабричный метод, основное преимущество абстрактного шаблона фабрики заключается в том, что он может ограничивать семейство продуктов внутри класса. Так называемое семейство продуктов обычно более или менее имеет определенную связь, и шаблон абстрактной фабрики может определять и описывать отношения между семейством продуктов внутри класса без введения нового класса для управления им.
-
Недостаток: Расширение семейства продуктов будет очень трудоемким делом, если в семейство продуктов нужно добавить новый продукт, то придется модифицировать почти все фабричные классы. Поэтому при использовании шаблона абстрактной фабрики очень важно разделение иерархии продуктов.
Суммировать
Теперь мы закончили построение трех фабричных режимов. Между ними есть различия и связи. Это вопрос мнения о том, какой режим использовать. Часто в процессе развития бизнеса он будет меняться от простого фабричного режима к пошаговый режим Фабричный метод или абстрактный фабричный шаблон
Результатом порождающего шаблона проектирования является получение указанного объекта. Между ними нет хороших или плохих шаблонов, и их можно использовать по мере необходимости. Пока цель разделения может быть достигнута, это хороший шаблон.
Вышеприведенный код помещается вgolang-design-patternsна этом складе
Рекламируйте и рекомендуйте фреймворк go web, написанный вамиbingo, просить звезду, просить пиар ~