Шаблон проектирования "Абстрактная фабрика"
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