>백엔드 개발 >PHP 튜토리얼 >PHP에서 일반적으로 사용되는 세 가지 디자인 패턴 요약

PHP에서 일반적으로 사용되는 세 가지 디자인 패턴 요약

墨辰丷
墨辰丷원래의
2018-06-01 14:28:491437검색

이 기사에서는 PHP에서 가장 일반적으로 사용되는 세 가지 디자인 패턴인 싱글톤 디자인 패턴, 팩토리 디자인 패턴 및 관찰자 디자인 패턴에 대해 간략하게 소개합니다. 이것은 개인적인 경험 요약입니다.

싱글턴 디자인 패턴

소위 싱글턴 패턴은 일단 생성되면 애플리케이션에 이 클래스의 인스턴스가 하나만 있다는 것을 의미합니다. , 그것은 항상 메모리에 존재합니다!

싱글턴 디자인 패턴은 데이터베이스 클래스 디자인에 자주 사용됩니다. 싱글턴 모드는 여러 데이터베이스 연결이 열리는 것을 방지하기 위해 데이터베이스에 한 번만 연결하는 데 사용됩니다.

싱글턴 클래스는 다음과 같은 특성을 가져야 합니다.

싱글턴 클래스는 직접 인스턴스화로 생성할 수 없으며 클래스 자체에 의해서만 인스턴스화될 수 있습니다. 따라서 이러한 제한적인 효과를 얻으려면 생성자를 비공개로 표시하여 클래스가 인스턴스화되지 않도록 해야 합니다.

클래스 인스턴스를 저장하고 인스턴스에 액세스할 수 있는 공용 정적 메서드를 노출하려면 전용 정적 멤버 변수가 필요합니다.

PHP에서는 다른 사람이 싱글톤 클래스 인스턴스를 복제하는 것을 방지하기 위해 일반적으로 빈 개인 __clone() 메소드가 제공됩니다.

싱글톤 패턴의 예:

 <?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.
  privatefunction__construct()
  {
    // Do nothing.
  }
 
  privatefunction__clone() 
  {
    // Do nothing.
  }
 
  publicstatic functiongetInstance() 
  {
    if (!(self::$instanceinstanceofself)) {
      self::$instance = newself();
    }
 
    returnself::$instance;
  }
}
 
$a =Database::getInstance();
$b =Database::getInstance();
 
// true
var_dump($a === $b);

Factory 디자인 패턴

Factory 디자인 패턴은 종종 다양한 입력 매개변수 또는 애플리케이션 구성을 기반으로 인스턴스화하고 반환하는 특별한 방법을 만드는 데 사용됩니다. 해당 수업.

예를 들어 직사각형과 원이 동일한 메소드를 가지고 있다고 가정합니다. 그런 다음 기본 클래스에서 제공하는 API를 사용하여 인스턴스를 생성하면 모두 매개변수를 전달하여 해당 클래스의 인스턴스를 자동으로 생성합니다. 둘레와 면적.

 <?php
 
interfaceInterfaceShape 
{
 functiongetArea();
 functiongetCircumference();
}
 
/**
* 矩形
*/
class Rectangle implementsInterfaceShape
{
  private $width;
  private $height;
  
  publicfunction__construct($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;
 
  function__construct($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);

Observer 디자인 패턴

Observer 패턴은 매우 일반적인 디자인 패턴이지만, 잘못 사용하면 프로그램에 큰 편리함을 가져다 줄 것입니다. 유지 관리 아이디어.

관찰자 패턴이란 무엇인가요? 객체는 다른 객체인 관찰자가 자신을 등록할 수 있도록 하는 메서드를 제공하여 자신을 관찰 가능하게 만듭니다. 관찰 가능한 객체가 변경되면 등록된 관찰자에게 메시지를 보냅니다. 이러한 관찰자는 이 정보를 사용하여 관찰 가능한 객체와 독립적인 작업을 수행합니다. 결과적으로 객체는 이유를 이해하지 않고도 서로 대화할 수 있습니다. 관찰자 패턴은 클래스가 다른 클래스의 상태를 관찰할 수 있도록 하는 이벤트 시스템입니다. 관찰된 클래스의 상태가 변경되면 관찰 클래스는 알림을 받고 해당 조치를 취할 수 있습니다. 구성 요소 간의 긴밀한 결합을 방지하는 기능이 있습니다. 아래 예시를 보시면 이해가 되실 거에요!

 <?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"

요약: 위 내용은 이 글의 전체 내용입니다. 모든 분들의 공부에 도움이 되었으면 좋겠습니다.

관련 추천:

php in_array() 배열에 특정 값이 존재하는지 확인하는 방법에 대한 자세한 설명

PHP 마젠토 백그라운드에 로그인할 수 없는 문제 해결 방법

php데이터가 성공적으로 삽입되었는지 모니터링 Mysql 데이터베이스에 대한 방법

위 내용은 PHP에서 일반적으로 사용되는 세 가지 디자인 패턴 요약의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.