> 백엔드 개발 > PHP 튜토리얼 > PHP 디자인 패턴(재인쇄)

PHP 디자인 패턴(재인쇄)

WBOY
풀어 주다: 2016-07-30 13:30:50
원래의
975명이 탐색했습니다.

원본링크: http://www.cnblogs.com/siqi/archive/2012/09/09/2667562.html

1. >

싱글턴 모드는 이름에서 알 수 있듯이 인스턴스가 하나만 있다는 의미입니다. 싱글턴 모드는 객체 생성 모드로서 특정 클래스의 인스턴스가 하나만 존재하도록 보장하고, 스스로 인스턴스화하여 이 인스턴스를 전체 시스템에 제공합니다.

싱글턴 패턴에는 세 가지 주요 사항이 있습니다.

  1. 첫째, 클래스는 하나의 인스턴스만 가질 수 있습니다.
  2. 두 번째는 이 인스턴스를 스스로 생성해야 한다는 것입니다.
  3. 세 번째는 이 인스턴스를 전체 시스템에 제공해야 한다는 것입니다. 그 자체.
PHP 싱글턴 모드를 사용하는 이유

  1. 1. PHP의 응용은 주로 데이터베이스 응용, 애플리케이션에서 많은 수의 데이터베이스 작업이 발생하게 됩니다. 객체 지향 방식으로 개발할 때 싱글톤 모드를 사용하면 리소스를 소비하는 많은 수의 새로운 작업을 피할 수 있고 데이터베이스 연결도 줄일 수 있습니다. 너무 많은 연결이 발생할 가능성이 적습니다.
  2. 2. 특정 구성 정보 를 전역적으로 제어하기 위해 시스템에 클래스가 필요한 경우 그러면 싱글톤 모드를 이용하여 쉽게 구현할 수 있습니다. 이에 대해서는 zend Framework의 FrontController 부분을 참고하세요.
  3. 3. 페이지 요청에서 디버깅을 용이하게 합니다. 모든 코드(예: 데이터베이스 작업 클래스 db)가 하나의 클래스에 집중되어 있기 때문에 클래스에 후크를 설정하고 로그를 출력하여 모든 곳에서 var_dump 및 echo를 방지할 수 있습니다.

예:

PHP 디자인 패턴(재인쇄)

/**
* 디자인 패턴의 싱글톤 패턴
* $_instance는 정적 프라이빗 변수로 선언해야 합니다.
* 생성자는 프라이빗으로 선언해야 합니다. 방지 외부 프로그램의 새 클래스는 싱글톤 모드의 의미를 잃습니다.
* getInstance() 메소드는 공개로 설정되어야 하며, 이 메소드는 인스턴스에 대한 참조를 반환하기 위해 호출되어야 합니다.
* :: 운영자는 액세스만 가능합니다. 정적 변수 및 정적 변수 기능
* 새로운 객체는 메모리를 소비합니다
* 사용 시나리오: 가장 일반적으로 사용되는 곳은 데이터베이스 연결입니다.
* 싱글톤 모드를 사용하여 객체를 생성한 후에는 해당 객체를 다른 많은 객체에서 사용할 수 있습니다.
*/
class man
{
//이 속성에 인스턴스를 저장합니다  private static $_instance;
 //생성자는 직접 생성을 방지하기 위해 private으로 선언됩니다. 개체 privatefunction __construct()
 {
  echo '인스턴스화되었습니다! ';
}
 //단일 인스턴스 방법 공개 정적 함수 get_instance()
{
 var_dump(isset(self::$_instance));
 
 if (!설정(self::$_instance))
                                                                                   ();
} 반환 본인::$ _instance
;
} //사용자가 객체 인스턴스를 복사하지 못하도록 방지
private
function __clone() { }함수 테스트()
 {
  에코("test"); }}

// 생성자가 private으로 선언되었기 때문에 이 작성 방법은 잘못됩니다.
//$test = new man;
// 다음은 예제 클래스의 싱글톤 개체를 가져옵니다. $ 테스트
= man::get_instance();

$test = man::get_instance();$test
->test ();
// 객체를 복사하면 E_USER_ERROR가 발생합니다.
//$test_clone = clone $test;


2. 간단한 팩토리 패턴

PHP 디자인 패턴(재인쇄)①추상 기본 클래스: 추상 메소드를 정의합니다. 사용할 클래스

을 서브클래스에 구현 ② 추상 베이스 클래스에서 상속받은 서브클래스 : 베이스 클래스

    에 추상 메소드를 구현 ③Factory class: 해당 하위 클래스를 모두 인스턴스화하려면
을 사용합니다.


/**
*
* 추상 클래스를 정의하고 하위 클래스가 이를 상속 및 구현하도록 합니다.
*
*/
                                                                                                         🎜>추상 공개 함수
getValue($num1,$num2);//하위 클래스가 이 기능 함수를 구현해야 한다는 것이 강력히 요구됩니다 } 🎜 >*/class OperationAdd 확장 작업 {공개

함수
getValue(
$num1,$num2){
   
반환
$num1+
$num2;  } }                              > 공개
 함수 getValue($num1,$num2){            🎜>return
$num1- $num2; * 곱셈 클래스 
*/

 class OperationMul 확장
연산 {
 
공개 함수
getValue($num1,$num2){
                                                🎜>; } } class OperationDiv 확장 Operation {                                                      🎜>){ 🎜>
예외 잡아 (예외 $e){                                                                       >에코
"오류 메시지:".
$e
->getMessage(); } } }


객체 지향 상속 기능을 사용하면 '거듭제곱', '제곱근', '대수', '삼각 함수', '통계'와 같은 원래 프로그램을 쉽게 확장할 수 있습니다. 등을 사용하여 불필요한 코드를 로드하지 않도록 합니다.

지금 나머지 클래스를 추가해야 한다면 매우 간단합니다.

다른 클래스만 작성하면 됩니다(이 클래스는 가상 기본 클래스를 상속합니다). 해당 기능(예: 전력 계산)이 클래스에서 완료되고 결합 정도가 크게 감소되어 향후 유지 관리 및 확장이 용이합니다

PHP 디자인 패턴(재인쇄)

 /**
* 나머지(나머지) 구하기
*
 
*/
  classOperationRem확장Operation {
  public function getValue($num1,$num2> 🎜>
아직 해결되지 않은 문제가 있는데, 사용자가 입력한 연산자에 따라 프로그램이 해당 객체를 어떻게 인스턴스화하게 하느냐는 것입니다. 해결책: 별도의 클래스를 사용하여 인스턴스화 프로세스를 구현합니다. 이 클래스는 팩토리입니다.

/*PHP 디자인 패턴(재인쇄)* * 주로 객체를 생성하는 데 사용되는 엔지니어링 클래스

* 기능: 입력된 연산 기호에 따라 공장에서 해당 객체를 인스턴스화할 수 있습니다.

*


*/

class공장{PHP 디자인 패턴(재인쇄) $operate

){

switch ($operate
){

사례
'+':
                                                     >반환 신규 OperationAdd();
                                                                                                                                                       > 신규 OperationSub ();
                                                                                                    > ~                                                    eObj( '/'); $result=$test->getValue(23,0); echo 
$result ;

이 모드에 대한 기타 참고 사항:

공장 모드:
운송을 예로 들어보겠습니다. 운송과 운송을 모두 맞춤 설정할 수 있도록 요청하세요. 도구 프로세스 제작
1> 맞춤형 운송
1. 도구 전달 방법(시작, 실행, 중지)을 포함하는 인터페이스 정의
2. 비행기, 자동차 등에 구현하도록 합니다
2> Customization Factory(위와 유사)
1. 다음을 포함하는 인터페이스를 정의합니다. 작업 도구 제작 방법(시작, 실행, 정지)
2. 항공기와 자동차를 각각 제작하는 팩토리 클래스를 작성하여 이 인터페이스를 상속하고 구현합니다

원문 주소 : http://bbs.phpchina.com/thread-242243-1-1.html

3. 관찰자 패턴

관찰자 패턴 동작 패턴은 객체 간의 일대다 종속 관계를 정의하여 객체의 상태가 변경되면 해당 객체에 의존하는 모든 객체에 알림을 보내고 자동으로 새로 고쳐지도록 하는 것입니다. 관찰 대상과 관찰 대상을 완벽하게 분리합니다. 주체에 관심이 있는 종속성(관찰자) 목록은 별도의 개체(주체)에서 유지 관리될 수 있습니다. 모든 관찰자가 공통 관찰자 인터페이스를 개별적으로 구현하여 주체 개체와 종속 개체 간의 직접적인 종속성을 제거하도록 합니다. (어쨌든 이해가 안됨)

spl(표준 php 라이브러리) 사용

PHP 디자인 패턴(재인쇄)

class MyObserver1 구현 SplObserver {
public function update(SplSubject $subject) {
echo __CLASS__ . ' - ' . $subject->getName();
}
}
클래스 MyObserver2 구현 SplObserver {
public function update(SplSubject $subject) {
echo __CLASS__ . ' - ' . $subject->getName();
}
}
class MySubject SplSubject {
private $_observers;
private $_name;
구현 공개 함수 __construct($name) {
                                                 $this-> _observers->attach($observer
); } 공개
함수
detach(SplObserver $observer) { ); } 공개
함수 inform() { as

$observer) {                                                                              } 공개
$observer1 = MyObserver1();
$observer2
= MyObserver2();$subject
= MySubject("test ");$subject->attach($observer1) ;
$subject->attach($observer2 );


$subject

->notify();

참고 원문: http://www.php.net/manual/zh/class. splsubject .php

4. 전략 모드

이 모드에서는 알고리즘이 의 복잡한 클래스이므로 으로 편리하게 바꿀 수 있습니다. 예를 들어, 검색 엔진에서 페이지 순위를 매기는 방식을 변경하려면 전략 모드를 선택하는 것이 좋습니다. 검색 엔진의 구성요소에 대해 생각해 보세요. ——한 부분은 페이지를 순회하고, 한 부분은 각 페이지를 정렬하고, 다른 부분은 정렬 결과에 따라 정렬합니다. 복잡한 예에서 이러한 부분은 모두 동일한 클래스에 있습니다. 전략 패턴을 사용하면 정렬 부분을 다른 클래스에 넣어 나머지 검색 엔진 코드에 영향을 주지 않고 페이지 정렬 방식을 변경할 수 있습니다.


더 간단한 예로, 아래는 세트를 기반으로 사용자 목록을 제공하는 사용자 목록 클래스를 보여줍니다. 사용자 집합을 찾기 위한 플러그 앤 플레이 전략 방법

PHP 디자인 패턴(재인쇄)

//인터페이스 정의인터페이스 IStrategy {
기능 filter($record);
}
//인터페이스 메소드 1 구현class FindAfterStrategy implements IStrategy {
private $_name;
 public function __construct($name) {
 $this-> ;_name = $name;
}
공개 함수 필터($record) {
>return strcmp ( $this->_name, $record ) }
}

//인터페이스 메소드 1 구현class RandomStrategy implements IStrategy {
public 함수 필터($record) {                                                                             
//메인 클래스
클래스
UserList {
private $_list = 배열 ();
 public function __construct($names ) {
 if ( $names != null) {
                                      ~                                       🎜>  공개 기능 추가($name) {
                                                                                                         } 공개 기능 찾기( $filter
) { $recs = 배열
();

foreach
(
$this-> ;_list as $user ) { user
; } >new UserList( 배열
(
"앤디",
"잭", "로리", "메건" ) );$f1 =
$ul->find ( new FindAfterStrategy ( "J" ) );
print_r ( $f1 );$ f2 = $ul->find(
new RandomStrategy () );
print_r (
$f2
); >전략 패턴은 데이터 필터링, 검색, 처리 방식에서 높은 유연성이 요구되는 복잡한 데이터 관리 시스템이나 데이터 처리 시스템에 매우 적합합니다

위 내용은 내용의 측면을 포함하여 PHP 디자인 패턴(복사본)을 소개한 것입니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿