Реальные примеры шаблонов Factory Method - PullRequest
24 голосов
/ 05 марта 2010

Я только что прочитал Factory Method.Я понимаю, что это предоставляет способ делегировать создание экземпляров подклассам.Но я не мог понять возможные варианты использования в реальном сценарии.

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

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

Ответы [ 6 ]

48 голосов
/ 05 марта 2010

Класс, реализующий шаблон проектирования фабрики, работает как мост между несколькими классами. Рассмотрим пример использования нескольких серверов баз данных, таких как SQL Server и Oracle. Если вы разрабатываете приложение, используя базу данных SQL Server в качестве бэкэнда, но в будущем вам потребуется изменить базу данных бэкэнда на oracle, вам потребуется изменить весь код, если вы не написали свой код в соответствии с шаблоном фабричного проектирования.

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

8 голосов
/ 01 января 2015

Пример php кода:

interface DbTable
{
    public function create($array);
}

class MySqlTable implements DbTable
{
    public function create($array)
    {
        // add a record to a table on mysql database
    }
}

class OracleTable implements DbTable
{
    public function create($array)
    {
        // add a record to a table on oracle database
    }
}

class TableFactory
{
    private $dbTypeConfig = 'mysql';

    public function createTable()
    {
        if ($this->dbTypeConfig == 'mysql') {
            return new MySqlTable();
        } elseif ($this->dbTypeConfig == 'oracle') {
            return new OracleTable();
        }
        return null;
    }
}
3 голосов
/ 05 марта 2010

Zend_Db использует его в своем классе Zend_Db_Adapter , чтобы разрешить создание различных типов объектов базы данных на основе параметров базы данных, переданных из объекта конфигурации.

3 голосов
/ 05 марта 2010

Из API, который я сейчас разрабатываю:

WebGalleryFactory factory = WebGalleryFactory.newInstance (WebGalleryType.PICASA);
WebAlbum album = factory.createAlbum (title, description);

В этом примере я использую фабричный метод для создания абстрактной фабрики определенного типа (в примере PICASA).

Эти два паттерна часто используются вместе.

2 голосов
/ 05 марта 2010

Один пример из библиотеки базовых классов .NET (BCL): Control.CreateControlsInstance , который используется многими другими членами класса элемента управления (Windows Forms).

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

0 голосов
/ 05 января 2015

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...