Это то, как Шаблон "фабрика" работает?

Singleton и шаблоны Реестра были очень просты и легки, чтобы я понял сразу же, но Шаблон "фабрика" был чем-то, что я не смог заставить мозг интерпретировать 100% все же. Я думаю, что мог бы понять это теперь, я имею, написал код кода ниже, рассмотрите и скажите мне, если это - надлежащее использование Шаблона "фабрика". Образец находится в PHP...

setDatabaseObject(self::$_database);
        $user->setCacheObject(self::$_cache);
        $user->setSessionObject(self::$_session);
        return $user;
    }

    // other objects will be here someday......
}

/**
 *  User.class.php
 */
class User
{
    public function __construct() { }

    // inject Database Object
    public function setDatabaseObject($databaseConnectionObject)
    {
        $this->_databaseObject = $databaseConnectionObject;
    }

    // inject Cache Object
    public function setCacheObject($cacheObject)
    {
        $this->_cacheObject = $cacheObject;
    }

    // inject Session Object
    public function setSessionObject($sessionObject)
    {
        $this->_sessionObject = $sessionObject;
    }

    // other methods here for User object...........
}

/**
 *  index.php  Main page that puts it all together
 *  assume that classes are autoloaded into this page already
 */
// Set our Database + Cache + Session objects into the Factory Object
Factory::$_database = new Databse();
Factory::$_cache = new Cache();
Factory::$_session = new Session();

// Create our User object
// The factory class will build the User object and inject all
// it's dependencies for us =)
$user = Factory::makeUserObject();

?>

Таким образом, basicly База данных, Кэш и объекты Сессии создаются (не показанный здесь) затем, они добавляются к Объекту фабрики, я сборка банки метод в классе фабрики для каждого объекта, которому будет нужна любая из этих 3 зависимостей и я могу установить, которые они добираются также. Это также делает его, где отдельные классы могут все еще быть несколько портативными, поскольку я могу непосредственно ввести там зависимости, если я хотел без объекта фабрики. Это звучит правильным? Если это правильно, это звучит действительно полезным


ОБНОВЛЕНИЕ № 1

Это базируется от этого здесь сообщение в блоге, я прочитал здесь http://www.potstuck.com/2009/01/08/php-dependency-injection/, они называют его "фабрикой", я, использование Реестра и большого количества людей продолжает говорить мне изучать "фабрику" и все, что я считал об этом, просто не нажал в моей голове, пока я не считал этот artcle, но похож на него, не "фабрика"?


ОБНОВЛЕНИЕ № 2
Из Википедии http://en.wikipedia.org/wiki/Factory_object В объектно-ориентированном программировании объект фабрики является объектом для создания других объектов. Это - абстракция конструктора и может использоваться для реализации различных схем выделения, таких как шаблон "одиночка". Объект фабрики обычно имеет метод для каждого вида объекта, это способно к созданию. Эти методы дополнительно принимают определение параметров, как объект создается, и затем возвратите созданный объект. Объекты фабрики используются в ситуациях, где овладение объектом конкретного вида является более сложным процессом, чем простое создание нового объекта. Объект фабрики мог бы решить создать класс объекта (если применимо) динамично, возвратить его из пула объектов, реализовать сложную конфигурацию на объекте или другие вещи.

Таким образом, возможно, это - "Объект фабрики" способом afterall...

8
задан JasonDavis 26 January 2010 в 10:17
поделиться

5 ответов

Обобщил и расширил мои комментарии снизу к вопросу здесь

Как говорили другие, это не Factory , просто потому, что шаблон с таким именем не существует. Это либо AbstractFactory , либо FactoryMethod , хотя прагматично люди часто обращаются к любому из них или просто говорят Factory , и это меня устраивает.

Сеанс, кэш и БД обычно инициализируются на ранней стадии выполнения приложения, так что это, по сути, работа начальной загрузки. У меня сложилось впечатление, что вы ищете не столько создание объектов, сколько их обработку во всем приложении. Это несколько отличается от того, что делает FactoryWhatever .

Как я сказал в комментариях, то, что это не совсем FactoryWhatever , не означает, что ваш код плохой. Если это решит вашу проблему, это круто. Но я все еще думаю, что вы пытаетесь сделать, например создание и управляющих ресурсов во время выполнения лучше всего использовать с DI Service Container .

Если вы не хотите использовать контейнер DI сейчас для этого, вы можете взглянуть на Zend_Application и то, как они загружают ресурсы . Это альтернатива, которая оставляет возможность добавить контейнеры DI позже.

Фактически, довольно много тем из ваших предыдущих вопросов уже было решено в Zend Framework, напримерКонфигурационные классы. Я не говорю использовать ZF, но вы можете проверить, как они работают. Конечно, вы также можете посмотреть другие фреймворки .

Некоторые сайты шаблонов с примерами PHP:

6
ответ дан 5 December 2019 в 10:02
поделиться

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

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

Например, StackoverFlow дает пользователям разных прав в зависимости от их репутации. Гипотетически говоря, он может иметь следующие типы пользователей:

NewbieUser      [1-100]
BeginnerUser    [101-1000]
AverageJoeUser  [1001-5000]
VeteranUser     [5001-20000]
PowerUser       [20001-50000]
GodModeUser     [50001-100000]

, и пользователь может быть создан, посмотрев на их реп. и создание соответствующего объекта пользователя напрямую ссылается на класс. Jon Skeet не отображается ни в одной категории, если вам интересно. Вот дерьмовая реализация с прямой атмосферой:

if(reputation >= 1001 and reputation <= 5000) {
    AverageJoeUser user = new AverageJoeUser();
}

Если позже позже по дороге мы должны были изменить названия классов или то, как пользователи были созданы, каждый экземпляр, где объект был создан, должен быть найден и изменен. Довольно много работы, если вы спросите меня. Вместо этого, если мы использовали заводской шаблон здесь, изменение будет проходить один метод внутри заводского класса.

class UserFactory {
    public static User createUser(Integer reputation) {
        ...
    }
}
5
ответ дан 5 December 2019 в 10:02
поделиться

Так как кажется, вы просто хотите создать пользователь, я не вижу необходимости абстрактного фактора, отныне просто упоминается как завод. Идея заводов состоит в том, чтобы создать объекты, которые реализуют определенный интерфейс. Вы бы хотели уметь создать две разные реализации одного и того же интерфейса. Дело в том, что вам, возможно, придется создавать эти объекты снова и снова, и изменять его от Objecta на OBJECTB по всему коду громоздким. Обмен на заводе легко, потому что это часто является синглтоном.

Идея фабричного метода связана с Frameworks: вы хотите создать использование в каком-либо рамочной коде, но фактическая реализация пользователя находится в полученных классах, т. Е. Есть пользователи вашей структуры, написавшего свое собственное приложение - то есть когда вам нужно Чтобы сообщить пользователю вашей рамки «Создайте объект пользователя сейчас», который является вызовом на заводской метод. Пользователь должен реализовать это. Это также называется виртуальным компонентом согласно GOF.

Строитель обычно используется, когда есть разные представления объекта, что на самом деле здесь не так. В моих глазах, кэш, база данных и сеанс могут быть реализованы как Singletons, что облегчает участие тонкостей. В противном случае я бы предложил использовать сервивелок, который позволяет вам getDatabase , Getsession и т. Д. Тогда вам придется пройти локатор на объект пользователя (и многие другие объекты) на создание. Увеличивается, что этот локатор может быть повторно использован в разных классах.

2
ответ дан 5 December 2019 в 10:02
поделиться

выглядят больше похоже на шаблон строителя для меня. Какой заводской шаблон вы на самом деле имели в виду, abractfactory или FactoryMethod? Тем не менее, они оба касаются наследования, и ваш код просто собирает «сложный» объект.

1
ответ дан 5 December 2019 в 10:02
поделиться

не похоже на фабрику, - может быть застройщик изнутри?; 0)

Фабрика - это способ скрытия реализации и создания института. И обычно есть некоторая сборка, но в двух словах ....

  public interface IUser
    {
        void DoSomething();
    }

    public class DumbUser : IUser
    {

        public void DoSomething()
        {
            // duh... what should i do?
        }

    }

    public class SmartUser : IUser
    {

        public void DoSomething()
        {
            // calclulating prime numbers while baking bread
        }

    }


    public class UserFactory
    {
        public static IUser CreateUser()
        {
            Random r = new Random(Environment.TickCount);

            return r.Next(10) > 5 ? (IUser) new SmartUser() : new DumbUser();
        }
    }

    public class YourProgram
    {
        public void Run()
        {
            IUser user = UserFactory.CreateUser();
            user.DoSomething();
        }
    }
3
ответ дан 5 December 2019 в 10:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: