Подтвердить что ты не робот

Разница между синглтоном и шаблоном factory

Я новичок в разработке шаблонов, и я не могу видеть разницу между этими двумя шаблонами, оба являются шаблонами создания arent? и какова цель каждого шаблона? спасибо.

4b9b3361

Ответ 1

Шаблон singleton гарантирует, что вы всегда получите тот же экземпляр любого типа, который вы извлекаете, тогда как шаблон factory обычно дает вам другой экземпляр каждого типа.

Цель singleton - это то, где вы хотите, чтобы все вызовы проходили через один и тот же экземпляр. Примером этого может быть класс, который управляет дисковым кэшем или получает данные из статического словаря; везде, где важно, только один известный экземпляр взаимодействует с ресурсом. Это делает его менее масштабируемым.

Цель factory заключается в создании и возврате новых экземпляров. Часто они фактически не будут одного и того же типа, но они будут реализацией одного и того же базового класса. Однако может быть много экземпляров каждого типа

Ответ 2

Singleton

Единый шаблон часто используется во многих приложениях, когда требуется только один экземпляр ресурса. Наиболее очевидным типом ресурса для веб-страниц PHP является соединение с базой данных, хотя могут использоваться другие типы ресурсов. При извлечении динамического создания веб-страницы может потребоваться несколько запросов к базе данных. Если можно использовать один экземпляр ресурса, а не создавать несколько соединений, служебные данные минимизируются. Единственный экземпляр в этом случае создается шаблоном singleton.

<?php
class db {
    /*** Declare instance ***/
    private static $instance = NULL;

    /**
     * the constructor is set to private so
     * so nobody can create a new instance using new
     */
    private function __construct() {
        /*** maybe set the db name here later ***/
    }

    /**
     * Return DB instance or create intitial connection
     *  @return object (PDO)
     * @access public
     */
    public static function getInstance() {
        if (!self::$instance) {
            self::$instance = new PDO("mysql:host='localhost';dbname='animals'", 'username', 'password');
            self::$instance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        }
        return self::$instance;
    }
    /**
     * Like the constructor, we make __clone private
     * so nobody can clone the instance
     */
    private function __clone() {

    }
} /*** end of class ***/
?>

Давайте посмотрим, что произошло в вышеописанном классе Singleton. Имя переменной $instance создается и создается private, это не гарантирует никого и пытается получить к нему доступ напрямую. Точно так же методы конструктора и __clone были закрыты, чтобы предотвратить клонирование класса или кто-то пытается создать экземпляр экземпляра. Класс имеет единственный метод для предоставления ресурса, метод getInstance().

Метод getInstance() проверяет, что экземпляр еще не существует. Если ни один экземпляр не существует, создается новый экземпляр класса PDO и назначается переменной $instance. Если существующий экземпляр доступен, метод getInstance() возвращает это. В результате возвращаемое значение всегда является одним и тем же экземпляром, и новый ресурс или служебные данные не требуются.

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

<?php
try {
    /*** query the database ***/
    $result = DB::getInstance()->query("SELECT animal_type, animal_name FROM animals");

    /*** loop over the results ***/
    foreach ($result as $row) {
        print $row['animal_type'] .' - '. $row['animal_name'] . '<br />';
    }
} catch (PDOException $e) {
    echo $e->getMessage();
}
?>

Factory

Шаблон factory - это класс, который создает для вас объекты, а не вам нужно использовать новое ключевое слово для его создания. factory, как следует из названия, factory для создания объектов. Зачем нам это надо? Рассмотрим приложение, которое использует параметр ini для конфигурации. Затем приложение будет изменено для получения параметров конфигурации из базы данных. Остальная часть приложения распадается, как карточный домик, когда база удалена. Эта "плотная связь" объектов, где каждый объект сильно зависит от другого, создает проблемы в более крупных приложениях. Требуется система, где объекты могут ссылаться друг на друга, но не зависят друг от друга.
В нашем примере файла конфигурации, становящегося базой данных, если другие классы были зависимы от класса, который читал из файла ini, и это было неожиданно вызвано проблемами класса базы данных. Используя шаблон дизайна factory, если вы измените тип объекта из класса читателя ini на класс базы данных, вам нужно только изменить factory. Любой другой код, который использует factory, будет обновляться автоматически.

<?php
/**
 * @config interface
 */
interface Config {
    function getName();
}

/**
 * @config class
 */
class userConfig implements Config {
    /*
     * @username
     */
     public $user_id;

     /*** contructor is empty ***/
     public function __construct($id) {
        $this->user_id = $id;
     }

     public static function Load($id) {
        return new userConfig($id);
     }

     public function getName() {
         try {
             /*** query the database ***/
             $sql = "SELECT username FROM user_table WHERE user_id=:user_id";
             $db = db::getInstance();
             $stmt = $db->prepare($sql)
             $stmt->bindParam(':user_id', $this->user_id, PDO::PARAM_INT);
             return $stmt->fetch(PDO::FETCH_COLUMN);    
        } catch (PDOException $e) {
            /*** handle exception here ***/
            return false;
        }
    }
} /*** end of class ***/

/*** returns instance of config ***/
$conf = userConfig::Load( 1 );
echo $conf->getName();
?> 

Это может показаться немного избыточным кодом для простого извлечения имени пользователя. Но в крупномасштабном приложении, где происходит переход от файла к базе данных, результаты могут быть катастрофическими. Здесь просто вопрос об изменении метода getName() получает имя, а возвращаемый объект тот же, что позволяет другим частям приложения, которым требуется имя пользователя, например: логин для тележки, продолжать, поскольку они сделал ранее.

Ответ 3

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

Шаблон Factory определяет интерфейс для создания объектов (без ограничений на сколько) и обычно абстрагирует контроль над тем, какой класс должен создавать экземпляр.

Ответ 4

Шаблон Singleton - это шаблон, целью которого является обеспечение того, чтобы независимо от того, сколько раз клиент (или несколько клиентов) запрашивает экземпляр этого конкретного типа, который будет создан (создан для них), они всегда получат то же самое один и только один экземпляр типа. Это гарантирует, что только один экземпляр типа может быть создан (например, если тип управляет 200 Мбайт в кешированной копией памяти некоторой структуры данных - вам нужна только одна копия). Тип Singleton обычно имеет factory, чтобы доставлять запрашивающим клиентам один и только один экземпляр.

A factory метод - это метод, который инкапсулирует создание или создание экземпляра типа, чтобы сам тип имел контроль над тем, как он выполняется.

Ответ 5

Singleton возвращает тот же экземпляр класса все время, factory может создавать объекты, создавая экземпляры различных классов или используя другие схемы , такие как пул объектов. поэтому singleton можно использовать в шаблоне factory