Einführung
Das Singleton-Muster bezieht sich auf ein Entwurfsmuster, bei dem eine Klasse in der gesamten Anwendung nur eine Objektinstanz hat. Es wird normalerweise verwendet, um Objekte zu erstellen, sicherzustellen, dass es nur eine Instanz einer Klasse gibt, sich selbst zu instanziieren und diese Instanz dem gesamten System bereitzustellen.
Es handelt sich um ein gängiges Entwurfsmuster. In Computersystemen werden Thread-Pools, Caches, Protokollobjekte, Dialogfelder, Drucker, Datenbankoperationen und Grafikkartentreiber häufig als Singletons entworfen.
Funktionen
Eine Klasse hat eine und nur eine Instanz in der gesamten Anwendung
Die Klasse muss diese Instanz selbst erstellen
Sie muss diese Instanz bereitstellen auf das gesamte System selbst
Funktion
Der größte Effekt der Verwendung des Singleton-Modus besteht darin, den Systemaufwand zu reduzieren und Ressourcen zu sparen. Wenn wir beispielsweise PHP für die tägliche Entwicklung verwenden, müssen wir häufig mehrmals eine Verbindung zu verschiedenen relationalen und nicht relationalen Datenbanken wie MySQL oder Redis herstellen. Wenn wir nicht den Singleton-Modus verwenden, müssen wir zum Erstellen mehrere Male eine neue Verbindung herstellen neue Instanzen, die viele Speicherressourcen und Systemressourcen verbrauchen.
Wichtige Punkte
1. Eine statische Mitgliedsvariable, die die einzige Instanz der Klasse enthält, ist erforderlich
private static $_instance;
2. Konstruktoren und Klonfunktionen müssen als privat deklariert werden externe Programme verhindern Die neue Klasse verliert somit die Bedeutung des Singleton-Modus
// 私有化构造方法,防止new实例 private function __construct() { $this->_db = pg_connect('demo'); } // 覆盖__clone()方法,禁止克隆 private function __clone() { }
3. Für den Zugriff auf diese Instanz muss eine öffentliche statische Methode (normalerweise die getInstance-Methode) bereitgestellt werden, wodurch eine Referenz auf die einzige zurückgegeben wird Instanz
// 用于返回对象实例的公共静态方法 public static function getInstance() { // 判断当前实例是否已经创建 if (!(self::$_instance instanceof self) ) { // 如果没有,则创建 self::$_instance = new self(); } // 最终返回实例 return self::$_instance; }
Erklärung
Jetzt nehme ich eine MySQL-Operationsklasse als Beispiel, um zu zeigen, wie man sie schreibt.
Code:
<?php /** * Class DB 数据库操作类 */ class Db { private $_db; private static $_instance; // 私有化构造方法,防止外部new实例 private function __construct(...) { // 这里主要用于连接数据库,细节此处省略 $this->_db = pg_connect(...); } // 覆盖__clone()方法,禁止克隆 private function __clone() { } // 返回对象实例 public static function getInstance() { // 判断是否存在对象实例 if(! (self::$_instance instanceof self) ) { // 不存在则创建保存 self::$_instance = new self(); } // 返回对象实例 return self::$_instance; } // 其他方法 public function addUserInfo(...) { } // 其他方法 public function getUserInfo(...) { } } // 演示 $db = Db::getInstance(); $db->addUserInfo(...); $db->getUserInfo(...);
Zusammenfassung
Nachdem ich so viel über das Singleton-Muster gesprochen habe, bedeutet das nicht, dass es keine Mängel aufweist. Im Folgenden liste ich die Verwendung von Singletons auf Schauen wir uns die Vor- und Nachteile des Modells an und Sie können es entsprechend Ihren tatsächlichen Anforderungen verwenden.
Vor- und Nachteile des Singleton-Musters:
Vorteile:
Verbesserung des Designs des Systems
Es ist eine Verbesserung gegenüber globalen Variablen
Systemressourcen-Overhead sparen
Nachteile:
Schwer zu debuggen
Versteckte Abhängigkeiten
Ein Singleton kann nicht mit falschem Datentyp überschrieben werden