Heim > Backend-Entwicklung > PHP-Tutorial > Wir stellen drei häufig verwendete Entwurfsmuster in PHP vor: Singleton-Entwurfsmuster, Fabrik-Entwurfsmuster und Beobachter-Entwurfsmuster.

Wir stellen drei häufig verwendete Entwurfsmuster in PHP vor: Singleton-Entwurfsmuster, Fabrik-Entwurfsmuster und Beobachter-Entwurfsmuster.

伊谢尔伦
Freigeben: 2023-03-12 10:02:02
Original
1443 Leute haben es durchsucht

In diesem Artikel werden die drei am häufigsten verwendeten Entwurfsmuster in PHP kurz vorgestellt: Singleton-Entwurfsmuster, Factory-Entwurfsmuster und Beobachter-Entwurfsmuster. Dies sind alles persönliche Erfahrungszusammenfassungen.

Dieser Artikel ist eine Notiz und Zusammenfassung der drei Designmuster, die häufig in PHP verwendet werden, egal welche Sprache verwendet wird, um etwas zu entwickeln Warum brauchen wir Designmuster? Welche Rolle und Bedeutung hat seine Geburt für uns Entwickler?

Ich glaube, dass diejenigen, die iOS entwickeln, mit Designmustern vertraut sind, oder? Zum Beispiel Singleton-Entwurfsmuster, Fabrikentwurfsmuster, Observer-Muster, MVC-Framework-Entwurfsmuster usw.

Als nächstes lernen wir die drei am häufigsten verwendeten Designmuster in PHP kennen: Singleton-Designmuster, Factory-Designmuster und Beobachter-Designmuster.

Einzelfall-Entwurfsmuster

Das sogenannte Einzelfallmuster bedeutet, dass höchstens eine Instanz der Klasse in der Anwendung vorhanden ist . Einmal erstellt, wird es immer im Gedächtnis existieren!

Das Singleton-Entwurfsmuster wird häufig beim Entwurf von Datenbankklassen verwendet. Das Singleton-Muster wird verwendet, um nur einmal eine Verbindung zur Datenbank herzustellen, um zu verhindern, dass mehrere Datenbankverbindungen geöffnet werden.

Eine Singleton-Klasse sollte die folgenden Eigenschaften haben:

Eine Singleton-Klasse kann nicht durch direkte Instanziierung erstellt werden, sondern nur durch die Klasse selbst instanziiert werden. Um eine solche restriktive Wirkung zu erzielen, muss daher der -Konstruktor als privat markiert werden, wodurch verhindert wird, dass die Klasse instanziiert wird.

Erfordert eine private statische Mitgliedsvariable, um die Klasseninstanz zu speichern und eine öffentliche statische Methode verfügbar zu machen, die auf die Instanz zugreifen kann.

Um zu verhindern, dass andere Instanzen von Singleton-Klassen klonen, wird in PHP normalerweise eine leere private clone()-Methode bereitgestellt.

Beispiele für Singleton-Muster:

<?php
 
/**
* Singleton of Database
*/
class Database
{
  // We need a static private variable to store a Database instance.
  privatestatic $instance;
 
  // Mark as private to prevent it from being instanced.
  privatefunctionconstruct()
  {
    // Do nothing.
  }
 
  privatefunctionclone() 
  {
    // Do nothing.
  }
 
  publicstatic functiongetInstance() 
  {
    if (!(self::$instanceinstanceofself)) {
      self::$instance = newself();
    }
 
    returnself::$instance;
  }
}
 
$a =Database::getInstance();
$b =Database::getInstance();
 
// true
var_dump($a === $b);
Nach dem Login kopieren

Factory-Design-Muster

Factory-Design-Muster werden oft basierend auf unterschiedlichen Eingabeparametern oder Anwendungskonfigurationen verwendet Der Unterschied besteht darin, eine Instanz zu erstellen, die speziell zum Instanziieren und Zurückgeben der entsprechenden Klasse verwendet wird.

Nehmen wir ein Beispiel. Wenn wir dann die von der Basisklasse bereitgestellte API verwenden, um eine Instanz zu erstellen, erstellen wir automatisch eine Instanz der entsprechenden Klasse Sie alle haben Zugriff auf die Funktionen Umfang und Fläche.

<?php
 
interfaceInterfaceShape 
{
 functiongetArea();
 functiongetCircumference();
}
 
/**
* 矩形
*/
class Rectangle implementsInterfaceShape
{
  private $width;
  private $height;
  
  publicfunctionconstruct($width, $height)
  {
    $this->width = $width;
    $this->height = $height;
  }
 
  publicfunctiongetArea() 
  {
    return $this->width* $this->height;
  }
 
  publicfunctiongetCircumference()
  {
    return 2 * $this->width + 2 * $this->height;
  }
}
 
/**
* 圆形
*/
class Circle implementsInterfaceShape
{
  private $radius;
 
  functionconstruct($radius)
  {
    $this->radius = $radius;
  }
 
 
  publicfunctiongetArea() 
  {
    return M_PI * pow($this->radius, 2);
  }
 
  publicfunctiongetCircumference()
  {
    return 2 * M_PI * $this->radius;
  }
}
 
/**
* 形状工厂类
*/
class FactoryShape 
{ 
  publicstatic functioncreate()
  {
    switch (func_num_args()) {
      case1:
      return newCircle(func_get_arg(0));
      case2:
      return newRectangle(func_get_arg(0), func_get_arg(1));
      default:
        # code...
        break;
    }
  } 
}
 
$rect =FactoryShape::create(5, 5);
// object(Rectangle)#1 (2) { ["width":"Rectangle":private]=> int(5) ["height":"Rectangle":private]=> int(5) }
var_dump($rect);
echo "<br>";
 
// object(Circle)#2 (1) { ["radius":"Circle":private]=> int(4) }
$circle =FactoryShape::create(4);
var_dump($circle);
Nach dem Login kopieren

Beobachter-Entwurfsmuster

Das Beobachtermuster ist ein sehr verbreitetes Entwurfsmuster, das bei unsachgemäßer Verwendung großen Nutzen bringt Geben Sie zukünftigen Generationen eine Idee, die schwer aufrechtzuerhalten ist.

Was ist das Beobachtermuster? Ein Objekt macht sich selbst beobachtbar, indem es Methoden bereitstellt, die es einem anderen Objekt, einem Beobachter, ermöglichen, sich selbst zu registrieren. Wenn sich ein beobachtbares Objekt ändert, sendet es Nachrichten an registrierte Beobachter. Diese Beobachter nutzen diese Informationen, um Operationen unabhängig vom beobachtbaren Objekt durchzuführen. Das Ergebnis ist, dass Objekte miteinander kommunizieren können, ohne verstehen zu müssen, warum. Das Beobachtermuster ist ein Ereignissystem, was bedeutet, dass dieses Muster es einer Klasse ermöglicht, den Zustand einer anderen Klasse zu beobachten. Wenn sich der Zustand der beobachteten Klasse ändert, kann die beobachtende Klasse Benachrichtigungen empfangen und entsprechende Beobachtungen durchführen mit der Fähigkeit, eine enge Kopplung zwischen Komponenten zu vermeiden. Sie werden es verstehen, wenn Sie sich das Beispiel unten ansehen!

<?php
 
/*
观察者接口
*/
interfaceInterfaceObserver
{
  functiononListen($sender, $args);
  functiongetObserverName();
}
 
// 可被观察者接口
interfaceInterfaceObservable
{
  functionaddObserver($observer);
  functionremoveObserver($observer_name);
}
 
// 观察者抽象类
abstractclass Observer implementsInterfaceObserver
{
  protected $observer_name;
 
  functiongetObserverName() 
  {
    return $this->observer_name;
  }
 
  functiononListen($sender, $args)
  {
 
  }
}
 
// 可被观察类
abstractclass Observable implementsInterfaceObservable 
{
  protected $observers = array();
 
  publicfunctionaddObserver($observer) 
  {
    if ($observerinstanceofInterfaceObserver) 
    {
      $this->observers[] = $observer;
    }
  }
 
  publicfunctionremoveObserver($observer_name) 
  {
    foreach ($this->observersas $index => $observer) 
    {
      if ($observer->getObserverName() === $observer_name) 
      {
        array_splice($this->observers, $index, 1);
        return;
      }
    }
  }
}
 
// 模拟一个可以被观察的类
class A extendsObservable 
{
  publicfunctionaddListener($listener) 
  {
    foreach ($this->observersas $observer) 
    {
      $observer->onListen($this, $listener);
    }
  }
}
 
// 模拟一个观察者类
class B extendsObserver 
{
  protected $observer_name = &#39;B&#39;;
 
  publicfunctiononListen($sender, $args) 
  {
    var_dump($sender);
    echo "<br>";
    var_dump($args);
    echo "<br>";
  }
}
 
// 模拟另外一个观察者类
class C extendsObserver 
{
  protected $observer_name = &#39;C&#39;;
 
  publicfunctiononListen($sender, $args) 
  {
    var_dump($sender);
    echo "<br>";
    var_dump($args);
    echo "<br>";
  }
}
 
$a = new A();
// 注入观察者
$a->addObserver(new B());
$a->addObserver(new C());
 
// 可以看到观察到的信息
$a->addListener(&#39;D&#39;);
 
// 移除观察者
$a->removeObserver(&#39;B&#39;);
 
// 打印的信息:
// object(A)#1 (1) { ["observers":protected]=> array(2) { [0]=> object(B)#2 (1) { ["observer_name":protected]=> string(1) "B" } [1]=> object(C)#3 (1) { ["observer_name":protected]=> string(1) "C" } } }
// string(1) "D"
// object(A)#1 (1) { ["observers":protected]=> array(2) { [0]=> object(B)#2 (1) { ["observer_name":protected]=> string(1) "B" } [1]=> object(C)#3 (1) { ["observer_name":protected]=> string(1) "C" } } }
// string(1) "D"
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWir stellen drei häufig verwendete Entwurfsmuster in PHP vor: Singleton-Entwurfsmuster, Fabrik-Entwurfsmuster und Beobachter-Entwurfsmuster.. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage