Как называется шаблон, когда он объединяет фабрику с шаблоном хранилища для создания или обновления / перезагрузки объектов?

Пример с MySQL:

/*
* Used to create a populated Staff instance
*/
class StaffCreator
{
/** @var MySql */
private $mySql;

function __construct(MySql $mySql)
{
$this->mySql = $mySql;
}

function createStaff(string $username): Staff
{
$staff = new Staff();
$staff->setData($this->getData($username));
return $staff;
}

function getData(string $username): array
{
return $this->mySql
->query("SELECT .. WHERE username = ?")->param($username)->getResults();
}
}

//calling:
$staff = (new StaffCreator($mysql))->createStaff($username);

Пример с Доктриной:

/**
* Creates Ledger
*/
class LedgerCreator
{
private $doctrine;

function __construct(EntityManager $doctrine)
{
$this->doctrine = $doctrine;
}

/**
* Create Domain entity called Ledger,
* populate it with items and metadata
* Return it
*/
function getLedger(int $ledgerId): Ledger
{
$query = $this->doctrine->createQuery('
SELECT ...
FROM ...
WHERE ...
')->setParameter('ledger_id', $ledgerId);

//create, init, populate, and return Ledger instance
$ledger = new Ledger($this->doctrine->find(LedgerEntity::class, $ledgerId));
$ledger->setItems($query->getResult());
return $ledger;
}
}

//to call:
$ledger = new LedgerCreator($doctrine)->createLedger($id);

Эта модель фабрика? Хранилище? DataMapper? Гибрид? Что-то другое?

3

Решение

Это извращенная версия строителя. Создает экземпляр объекта с заданными свойствами. В сочетании с картографом данных и хранилищем))

0

Другие решения

Этот вид выглядит как Memento, От Справочник по шаблонам PHP Design:

В паттерне Memento объект memento будет содержать состояние другого объекта.

От Википедия:

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

В этом примере класс BookMark представляет собой «Memento» и содержит состояние класса BookReader. В этом примере класс BookReader будет «инициатором», поскольку он имеет исходное состояние. TestMemento.php содержит объект BookMark, как и «смотритель».

Относительно ваших примеров:

            ----------- Example -----------
Participant | Mysql        | Doctrine
============|==============|==============
Originator  | MySql        | EntityManager
Caretaker   | StaffCreator | LedgerCreator
Memento     | Staff        | Ledger
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector