>  기사  >  백엔드 개발  >  PHP의 팩토리 패턴 이해

PHP의 팩토리 패턴 이해

高洛峰
高洛峰원래의
2016-12-17 10:53:401050검색

팩토리 클래스는 다른 객체를 생성하는 데 특별히 사용되는 클래스입니다. 다형성 프로그래밍에서 팩토리 클래스는 매우 중요합니다. 클래스를 동적으로 교체하고 구성을 수정하여 애플리케이션을 더욱 유연하게 만들 수 있습니다. 웹 개발에는 팩토리 패턴을 마스터하는 것이 필수적입니다.

팩토리 패턴은 일반적으로 인터페이스와 유사한 다양한 클래스를 반환하는 데 사용됩니다. 팩토리의 일반적인 용도는 다형성 공급자를 만드는 것입니다.

보통 팩토리 패턴에는 일반적으로 팩토리라는 이름의 정적 메서드인 핵심 구성이 있습니다. 이 정적 메서드는 여러 매개변수를 허용할 수 있으며 개체를 반환해야 합니다.

프로그램 목록: 기본 팩토리 클래스

class Fruit {
// 팩토리 클래스에서 반환된 개체
}

클래스 FruitFactory {

public static function Factory() {
// 객체의 새 인스턴스를 반환합니다
return new Fruit();
}
}

/ / 팩토리 호출
$instance = FruitFactory::factory();
?>

프로그램 목록: 팩토리 클래스를 사용하여 객체 생성

< ?php
class 예시
{
// 매개변수화된 팩토리 메소드
public static function Factory($type)
{
if (include_once 'Drivers/' . $type . ' .php' ) {
                                                                                                                              
}
}
// MySQL 드라이버 로드
$mysql = 예::factory('MySQL');
// SQLite 드라이버 로드
$sqlite = 예::factory( 'SQLite');
?>


프로그램 목록: 전체 팩토리 클래스

다음 프로그램은 일반 사항을 정의합니다. 모든 작업에 대해 빈 개체를 생성할 수 있는 팩토리 클래스인 경우 인스턴스를 얻을 수 있으며 이러한 작업은 모두 해당 인스턴스에 있습니다.

   
   /**
    * 일반 Factory 클래스
    *
    * 이 Magic Factory는 수행하는 모든 작업을 기억하고
    * 인스턴스화하는 개체에 적용합니다.
    *
   */
   class FruitFactory {
       private $history, $class, $constructor_args;
       
       /**
        * 특정 클래스의 팩토리를 생성합니다.
        * 클래스 생성자에 전달할 추가 인수를 허용합니다.
       */
       function __construct( $class ) {
           $args = func_get_args();
           $this->class = $class;
           $this->constructor_arg s = 배열_슬라이스( $ args, 1 );
       }
       
       function __call( $method, $args ) {
           $this->history[] = array(
               'action'   => ',
               '메서드'    => $method,
               'args'   => $args
           );
       }
      
       함수 __set( $property, $value ) {
           $this->history[] = array(
               'action'    => 'set',
               '속성'    => $property,
              '값'        =>
           );
       }
       
       /**
        * 인스턴스를 생성하고 이 MagicFactory에서 수행된 모든 작업을 수행합니다
       */
       function instance() {
           # $를 사용하여 리플렉션을 사용하여 새 인스턴스를 생성합니다. 인수
$reflection_object = new ReflectionClass( $this->class );
           $object = $reflection_object->newInstanceArgs( $this->constructor_args );
           
           # ReflectionClass를 사용하지 않지만 변수를 지원하지 않는 대체 메서드
           # 생성자 매개변수 수
           //$object = new $this->class();
           
           # 기억된 모든 작업을 반복하고 새 개체에 적용합니다.
           foreach( $this->history as $item ) {
               if( $item['action'] == 'call' ) {
                   call_user_func_array( array( $object, $item['method'] ), $item['args'] );
               }
               if( $item['action'] == '설정' >           # 완료
           return $object ;
       }
   }
   
   class Fruit {
       private $name, $color;
       public $price;
       
       기능 __ 구성( $name, $color ) {
           $this->name = $name;
           $this->color = $color;
       }
       
       함수 setName( $name ) {
$ this->name = $name; }, 가격은 {$this->price} RMB입니다.";
}
}

# 공장 설정
$fruit_factory = new FruitFactory('Fruit', 'Apple', 'Gonn');
$fruit_factory->setName('Apple');
$fruit_factory->price = 2;

# 인스턴스 가져오기
$apple = $fruit_factory->instance();
$apple->introduce();
?>


프로그램 실행 결과:

안녕하세요. Apple입니다. 가격은 2위안입니다.

팩토리 패턴은 주로 객체 생성을 위한 전환 인터페이스를 제공하여 특정 프로세스를 보호하고 격리합니다. 유연성 향상이라는 목적을 달성하기 위해 객체를 생성합니다.


팩토리 패턴은 세 가지 범주로 나눌 수 있습니다.

Simple Factory(Simple Factory)

Factory Method(Factory Method)

Abstract Factory Pattern( Abstract Factory)

이 세 가지 모드는 위에서 아래로 점차 추상화되어 보다 일반화됩니다.

간단한 팩토리 패턴은 정적 팩토리 메소드 패턴이라고도 합니다. 이름 변경을 보면 이 모드가 매우 간단하다는 것을 알 수 있습니다. 그 목적은 간단합니다. 객체를 생성하기 위한 인터페이스를 정의하는 것입니다. 팩토리 메서드 패턴은 단순 팩토리 패턴에서 팩토리 메서드의 정적 속성을 제거하여 하위 클래스에서 상속할 수 있도록 합니다. 이러한 방식으로 단순 팩토리 패턴의 팩토리 메소드에 집중된 압력을 팩토리 메소드 패턴의 여러 팩토리 하위 클래스에서 공유할 수 있습니다.

팩토리 메소드 패턴은 객체 생성을 완벽하게 패키징한 것으로 보이므로 클라이언트 프로그램은 추상 제품 역할에서 제공하는 인터페이스만 처리합니다. 그렇다면 코드 전체에 팩토리가 있어야 합니까? 그럴 필요가 없습니다. 어쩌면 다음과 같은 상황에서 팩토리 메소드 패턴 사용을 고려해 볼 수 있습니다.

클라이언트 프로그램이 사용할 객체의 생성 과정을 알 필요가 없는 경우.

클라이언트 프로그램에서 사용하는 객체가 변경될 수도 있고, 사용되는 특정 객체가 전혀 알려지지 않을 수도 있습니다.


PHP 팩토리 패턴 이해에 대한 더 많은 글을 보시려면, PHP 중국어 홈페이지를 주목해주세요!

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