Статья
Шаблон проектирования "Абстрактная фабрика"

Шаблон проектирования "Абстрактная фабрика"

25 февраля 2020

Относится к порождающим шаблонам.

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

Плюсы:
- создание объектов независимо от кода, который их использует (аналогично фабричному методу)
- позволяет создавать связанные продукты


Пример на PHP

abstract class AbstractFactory
{
    abstract public function createText($content);
}

class JsonFactory extends AbstractFactory
{
    public function createText($content)
    {
        return new JsonText($content);
    }
}

class HtmlFactory extends AbstractFactory
{
    public function createText($content)
    {
        return new HtmlText($content);
    }
}

abstract class Text
{
    private $text;

    public function __construct($text)
    {
        $this->text = $text;
    }
}

class JsonText extends Text
{
    // ...
}

class HtmlText extends Text
{
    // ...
}

Использование:

$factory = new HtmlFactory();
$text = $factory->createText('text');


Пример на Go

package main

type IText interface {
   CreateText()
   CreateHtml()
}

type JsonText struct {
}

func (t *JsonText) CreateText() {
}

func (t *JsonText) CreateHtml() {
}

type HtmlText struct {
}

func (t *HtmlText) CreatText() {
}

func (t *HtmlText) CreatHtml() {
}

type JsonFactory struct {
   text IText
}

func (f JsonFactory) createText() {
   f.text.CreateText()
}

func (f JsonFactory) createHtml() {
   f.text.CreateHtml()
}

func main() {
   factory := JsonFactory{text: &JsonText{}}
   factory.createHtml()
}



Источники:
http://designpatternsphp.readthedocs.io/ru/latest/Creational/AbstractFactory/README.html