abstract_factory

package
v0.0.0-...-6db54d9 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 15, 2021 License: MIT Imports: 0 Imported by: 0

README

Абстрактная фабрика (Abstract Factory)

Паттерн Abstract Factory относится к порождающим паттернам уровня объекта.

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

В общем виде абстрактная фабрика выглядит следующим образом. Для каждого из семейств объектов, создается конкретная фабрика (наследник абстрактной), посредством которой создаются продукты этого семейства.

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

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

Требуется для реализации:

  1. Класс абстрактной фабрики AbstractFactory, описывающий общий интерфейс фабрики, от которой будет наследоваться каждая конкретная фабрика;
  2. Класс абстрактного продукта AbstractProduct, описывающий общий интерфейс продукта, от которого будет наследоваться каждый конкретный продукт;
  3. Класс конкретной фабрики Factory;
  4. Класс конкретного продукта ProductA.
  5. Класс конкретного продукта ProductB.

Подведем итог.

Абстрактная фабрика представляет собой базовый класс, описывающий интерфейс конкретных фабрик, создающих продукты. Производные от него классы конкретных фабрик, должны реализовать этот интерфейс.

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

[!] В описании паттерна применяются общие понятия, такие как Класс, Объект, Абстрактный класс. Применимо к языку Go, это Пользовательский Тип, Значение этого Типа и Интерфейс. Также в языке Go за место общепринятого наследования используется агрегирование и встраивание.

-- THE END --

Documentation

Overview

Package abstract_factory is an example of the Abstract Factory Pattern.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type AbstractBottle

type AbstractBottle interface {
	PourWater(water AbstractWater) // Bottle interacts with a water.
	GetBottleVolume() float64
	GetWaterVolume() float64
}

AbstractBottle provides a bottle interface.

type AbstractFactory

type AbstractFactory interface {
	CreateWater(volume float64) AbstractWater
	CreateBottle(volume float64) AbstractBottle
}

AbstractFactory provides an interface for creating families of related objects.

func NewCocaColaFactory

func NewCocaColaFactory() AbstractFactory

NewCocaColaFactory is the CocaColaFactory constructor.

type AbstractWater

type AbstractWater interface {
	GetVolume() float64
}

AbstractWater provides a water interface.

type CocaColaBottle

type CocaColaBottle struct {
	// contains filtered or unexported fields
}

CocaColaBottle implements AbstractBottle.

func (*CocaColaBottle) GetBottleVolume

func (b *CocaColaBottle) GetBottleVolume() float64

GetBottleVolume returns volume of bottle.

func (*CocaColaBottle) GetWaterVolume

func (b *CocaColaBottle) GetWaterVolume() float64

GetWaterVolume returns volume of water.

func (*CocaColaBottle) PourWater

func (b *CocaColaBottle) PourWater(water AbstractWater)

PourWater pours water into a bottle.

type CocaColaFactory

type CocaColaFactory struct {
}

CocaColaFactory implements AbstractFactory interface.

func (*CocaColaFactory) CreateBottle

func (f *CocaColaFactory) CreateBottle(volume float64) AbstractBottle

CreateBottle implementation.

func (*CocaColaFactory) CreateWater

func (f *CocaColaFactory) CreateWater(volume float64) AbstractWater

CreateWater implementation.

type CocaColaWater

type CocaColaWater struct {
	// contains filtered or unexported fields
}

CocaColaWater implements AbstractWater.

func (*CocaColaWater) GetVolume

func (w *CocaColaWater) GetVolume() float64

GetVolume returns volume of drink.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL