이 기사에서는 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 = 'B'; publicfunctiononListen($sender, $args) { var_dump($sender); echo "<br>"; var_dump($args); echo "<br>"; } } // 模拟另外一个观察者类 class C extendsObserver { protected $observer_name = 'C'; 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('D'); // 移除观察者 $a->removeObserver('B'); // 打印的信息: // 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!