Шаблон фабричного метода шаблона проектирования golang

Go Шаблоны проектирования API продукт

Шаблон фабричного метода

wiki: Шаблон метода Factory — это шаблон объектно-ориентированного проектирования, который реализует концепцию «фабрики». Как и другие шаблоны создания, он также имеет дело с созданием объектов без указания их конкретного типа. Суть шаблона фабричного метода заключается в следующем: «Определите интерфейс для создания объектов, но пусть класс, реализующий интерфейс, решит, какой класс создавать экземпляр. Фабричный метод позволяет отложить создание экземпляра класса до подклассов».

Выше приведено определение фабричного метода в Википедии, в предыдущей статье.Простой заводской шаблон шаблона дизайна golangКак мы представили, только одна фабрика контролирует экземпляр всех продуктов, в то время как工厂方法Включая фабричный интерфейс, мы можем динамически реализовывать различные фабрики для достижения цели расширения.

  • Простые фабрики требуют:

    1. заводская структура
    2. интерфейс продукта
    3. структура продукта
  • Фабричный метод требует:

    1. заводской интерфейс
    2. заводская структура
    3. интерфейс продукта
    4. структура продукта

существует简单工厂, зависит только от объекта фабрики, если нам нужно создать экземпляр продукта, то нам нужно передать параметр фабрике, чтобы получить соответствующий объект, если мы хотим добавить продукт, нам нужно изменить функцию, которая создает продукт на фабрике совокупление чрезмерно сексуальное , пока в工厂方法, опираясь на фабричный интерфейс, мы можем создавать множество фабрик, реализуя фабричный интерфейс, чтобы один объект отвечал за создание экземпляров всех конкретных классов, а группа подклассов отвечала за создание конкретных классов, а процесс решен.

Для достижения используется следующий код:

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


  // 工厂接口
  type FactoryInterface interface {
  	  CreateProduct(t string) ProductInterface
  }

 // 产品接口
 type ProductInterface interface {
 	Intro()
 }

Затем реализуйте эти два интерфейса: структуру фабрики и структуру продукта.


  // 创建工厂结构体并实现工厂接口
  type Factory1 struct {
  }

  func (f Factory1) CreateProduct(t string) ProductInterface {
      switch t {
      case "product1":
          return Product1{}
      default:
          return nil
      }

  }


  // 创建产品1并实现产品接口
  type Product1 struct {
  }

  func (p Product1) Intro() {
	  fmt.Println("this is product 1")
  }

Таким образом, при использовании вы можете позволить подклассу выбирать, какой продукт создавать:

  // 创建工厂
  	f := new(Factory1)

  	p := f.CreateProduct("product1")
  	p.Intro()  // output:  this is product 1.

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

Каштан: теперь я хочу открыть магазин паровых булочек в моем родном городе Цицикар, где будут продаваться паровые булочки с начинкой из свинины и саньсянской начинкой, так как же нам использовать простую фабричную модель для достижения этой цели?

  • Простая реализация фабричного шаблона:

    1. Создать заводскую структуру (магазин Baozi)

        // 工厂类(包子店)
        type BunShop struct {
        }
      
    2. Создать интерфейс продукта (интерфейс подкласса пакета)

        type Bun interface {
        	create()
        }
      
    3. Продукт реализации (2 вида булочек)

      type PigMeatBuns struct {}
    
      func (p PigMeatBuns) create() {
        fmt.Println("猪肉馅包子")
      }
    
      type SamSunStuffingBuns struct {}
    
      func (s SamSunStuffingBuns) create() {
        fmt.Println("三鲜馅包子")
      }
    
    1. Добавить метод производства булочек для фабрики
      func (b BunShop) Generate(t string) Bun {
        switch t {
          case "pig":
            return PigMeatBuns{}
          case "3s":
            return SamSunStuffingBuns{}
          default:
            return nil
        }
      }
    
    1. Вот такая простая фабричная выкройка выполнена:
    
      factory := new(BunShop)
      b := factory.Generate("pig")
      b.create() // output: 猪肉馅包子
    

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

Вот где шаблон Factory Method пригодится...

  1. Добавьте заводской интерфейс (интерфейс магазина Baozi) и интерфейс продукта (интерфейс Baozi).

      type BunShopInterface interface{
         Generate(t string) Bun
      }
    
      type Bun interface {
         create()
      }
    
  2. Создайте структуру фабрики и структуру продукта (конкретный магазин булочек и конкретную булочку)

      type QSPigMeatBuns struct{}
      type GDPigMeatBuns struct{}

      type QSSamSunStuffingBuns struct{}
      type GDSamSunStuffingBuns struct{}

      // 实现产品接口...  这里就不写了
      // CODE ...
  1. Создайте соответствующие фабрики (магазин Qishi Baozi и магазин Guangdong Baozi)
    type QSBunShop struct {}

    type GDBunShop struct {}

    func (qs QSBunShop) Generate(t string) Bun {
       switch t {
           case "pig":
             return QSPigMeatBuns{}
           case "3s":
             return QSSamSunStuffingBuns{}
           default:
             return nil
        }
    }


    func (gd QSBunShop) Generate(t string) Bun {
         switch t {
           case "pig":
             return GDPigMeatBuns{}
           case "3s":
             return GDSamSunStuffingBuns{}
           default:
             return nil
           }
      }
  1. Таким образом, шаблон фабричного метода завершается.
      var b Bun
      // 卖呀卖呀卖包子...
      QSFactory := new(QSBunShop)
      b = QSFactory.Generate("pig")  // 传入猪肉馅的参数,会返回齐市包子铺的猪肉馅包子
      b.create()

      GDFactory := new(GDBunShop)
      b = GDFactory.Generate("pig") // 同样传入猪肉馅的参数,会返回广东包子铺的猪肉馅包子
      b.create()

В go нет наследования, на самом деле цель наследования может быть достигнута комбинированным способом.

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

Преимущества и недостатки шаблона фабричного метода

  • преимущество:

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

    2. Использование принципа инверсии зависимостей, полагаясь на абстракцию, а не на конкретность, слабую связь использования (клиент) и реализации (конкретный класс).

    3. Заказчику нужно знать только конкретную фабрику желаемого продукта, но не нужно знать процесс создания продукта на конкретной фабрике или даже имя класса конкретного продукта.

  • недостаток:

    1. Каждый раз, когда продукт добавляется, требуется определенный класс и конкретный создатель, что удваивает количество классов, что приводит к чрезмерному количеству системных классов и увеличению сложности.

    2. Для простой фабрики это класс фабрики, который добавляет функции и модифицирует; для фабричных методов это класс продукта, который добавляет функциональные модификации.

Вышеприведенный код помещается вgolang-design-patternsна этом складе

Рекламируйте и рекомендуйте фреймворк go web, написанный вамиbingo, просить звезду, просить пиар ~