PHP 디자인 모델 의 공장 모델(Factory Pattern)에 대한 설명

대상 을 대상 으로 프로 그래 밍 하 는 과정 에서 공장 모델 은 우리 가 가장 자주 사용 하 는 실례 화 대상 모델 이다.공장 유형 은 다른 대상 을 만 드 는 데 전문 적 으로 사용 되 는 유형 으로 공장 유형 은 다 형 프로 그래 밍 실천 에서 매우 중요 하 다.동적 으로 클래스 를 바 꾸 고 설정 을 수정 하면 프로그램 이 더욱 유연 해 집 니 다.공장 모델 을 파악 하 는 것 은 웹 개발 에 있어 서 없어 서 는 안 된다.그것 은 당신 의 시스템 에 더욱 큰 확장 성과 가능 한 한 적은 수 정 량 을 가 져 다 줄 것 이다.
공장 모델 은 보통 인터페이스 와 유사 한 다른 종 류 를 되 돌려 주 는데 공장 의 흔 한 용법 은 다 중 공급 자 를 만 드 는 것 이다.
일반적으로 공장 모델 은 일반적으로 factory 라 고 불 리 는 정적 방법 으로 관건 적 인 구 조 를 가지 고 있다.이 정적 방법 은 임의의 수량의 인 자 를 받 아들 일 수 있 으 며,반드시 대상 을 되 돌려 야 한다.
생활 에 매우 가 까 운 예 로 공장 모델 이 무엇 인지 알려 드 리 겠 습 니 다.
그런데 공장 모델 이 정말 거 추 장 스 러 운 가요?사실은 아니 야!그 가 디자인 모델 로 지금까지 전해 질 수 있다 는 것 은 틀림없이 그의 일리 가 있 을 것 이다!다만 우리 가 본 예 는 공장 모델 이 무엇 인지 설명 할 수 있 을 뿐 공장 모델 의 장점 을 잘 설명 하지 못 하기 때문에 우 리 는 배 운 후에 왜 공장 모델 을 사용 해 야 하 는 지,그리고 언제 공장 모델 을 사용 해 야 하 는 지 모른다!
사실 공장 모델 은 우리 의 현실 생활 에서 매우 흔히 볼 수 있 습 니 다.다음은 제 가 생활 속 의 예 를 들 면 공장 모델 의 용도 가 어디 에 있 는 지 알 수 있 을 것 입 니 다!
맥 도 날 드 다 들 드 셨 죠?우리 가 주문 하 러 갈 때,우 리 는 햄버거 하나,콜라 한 잔,감자 튀김 하 나 를 주문 할 수 있다.우 리 는 콜라 한 잔,감자 튀김 한 개 를 주문 할 수 있다.주문 이 끝나 면 주문 하 시 는 분 이 한 마디 더 하 시 겠 어 요?싫다 고?그리고 당신 의 이 식 사 는 다 시 켰 으 니 돈 을 줄 수 있 습 니 다.어,우 리 는 이것 이 건축 자 모델(Builder Pattern)이라는 것 을 발견 했다!
(ps:이것 은 확실히 갑 작 스 럽 게 발 견 된 것 입 니 다.전에 건축 자 모델 을 썼 을 때 이 예 를 생각 하지 못 했 습 니 다)
기본 공장 류:

<?php
 class Fruit {
 //         
 }
 Class FruitFactory {
 public static function factory() {
  //           
  return new Fruit();
 }
 }
 //     
 $instance = FruitFactory::factory();
?>
공장 류 생산 대상 이용:

<?php
class Example
{
  // The parameterized factory method
  public static function factory($type)
  {
    if (include_once 'Drivers/' . $type . '.php') {
      $classname = 'Driver_' . $type;
      return new $classname;
    } else {
      throw new Exception('Driver not found');
    }
  }
}
// Load a MySQL Driver
$mysql = Example::factory('MySQL');
// Load an SQLite Driver
$sqlite = Example::factory('SQLite');
?>
완전한 공장 종류:
다음 프로그램 은 모든 작업 의 빈 대상 을 저장 할 수 있 는 일반적인 공장 종 류 를 정의 합 니 다.이 작업 들 은 모두 그 인 스 턴 스 에 있 습 니 다.

<?php
  /**
   * Generic Factory class
   * This Factory will remember all operations you perform on it,
   * and apply them to the object it instantiates.
   */
  class FruitFactory {
    private $history, $class, $constructor_args;
    /**
     * Create a factory of given class. Accepts extra arguments to be passed to
     * class constructor.
     */
    function __construct( $class ) {
      $args = func_get_args();
      $this->class = $class;
      $this->constructor_args = array_slice( $args, 1 );
    }
    function __call( $method, $args ) {
      $this->history[] = array(
        'action'  => 'call',
        'method'  => $method,
        'args'  => $args
      );
    }
    function __set( $property, $value ) {
      $this->history[] = array(
        'action'  => 'set',
        'property'  => $property,
        'value'    => $value
      );
    }
    /**
     * Creates an instance and performs all operations that were done on this MagicFactory
     */
    function instance() {
      # use Reflection to create a new instance, using the $args 
      $reflection_object = new ReflectionClass( $this->class ); 
      $object = $reflection_object->newInstanceArgs( $this->constructor_args ); 
      # Alternative method that doesn't use ReflectionClass, but doesn't support variable
      # number of constructor parameters.
      //$object = new $this->class();
      # Repeat all remembered operations, apply to new object.
      foreach( $this->history as $item ) {
        if( $item['action'] == 'call' ) {
          call_user_func_array( array( $object, $item['method'] ), $item['args'] );
        }
        if( $item['action'] == 'set' ) {
          $object->{$item['property']} = $item['value'];
        }
      }
      # Done
      return $object;
    }
  }
  class Fruit {
    private $name, $color;
    public $price;
    function __construct( $name, $color ) {
      $this->name = $name;
      $this->color = $color;
    }
    function setName( $name ) {
      $this->name = $name;
    }
    function introduce() {
      print "Hello, this is an {$this->name} {$this->sirname}, its price is {$this->price} RMB.";
    }
  }
  # Setup a factory
  $fruit_factory = new FruitFactory('Fruit', 'Apple', 'Gonn');
  $fruit_factory->setName('Apple');
  $fruit_factory->price = 2;
  # Get an instance
  $apple = $fruit_factory->instance();
  $apple->introduce();
?>
공장 모델 은 주로 창설 대상 에 게 과도 인 터 페 이 스 를 제공 하여 창설 대상 의 구체 적 인 과정 을 차단 하고 격 리 시 켜 유연성 을 높이 는 목적 을 달성한다.
공장 모델 은 세 가지 로 나 눌 수 있다.
  • 단순 공장 모델(Simple Factory)
  • 공장 방법 모델(공장 방법)
  • 추상 적 인 공장 모델(Abstract Factory)
  • 이 세 가지 모델 은 위 에서 아래로 점차적으로 추상 적 이 고 더욱 일반적이다.
    간단 한 공장 모델 은 정적 공장 방법 모델 이 라 고도 부른다.이름 에서 알 수 있 듯 이 이 모델 은 틀림없이 매우 간단 할 것 이다.그것 이 존재 하 는 목적 은 매우 간단 하 다.대상 을 만 드 는 데 사용 할 인 터 페 이 스 를 정의 하 는 것 이다.
    공장 방법 모델 은 간단 한 공장 모델 에서 공장 방법의 정적 속성 을 제거 하여 이불 류 를 계승 할 수 있 게 한다.이렇게 간단 한 공장 모델 에서 공장 방법 에 집중 되 는 압력 은 공장 방법 모델 에서 서로 다른 공장 서브 클래스 가 분담 할 수 있다.
    공장 방법 모델 은 대상 의 생 성 을 완벽 하 게 포장 한 것 처럼 고객 프로그램 에서 추상 적 인 제품 역할 이 제공 하 는 인터페이스 만 처리 하도록 한다.그럼 우 리 는 반드시 코드 에 공장 을 널리 퍼 뜨 려 야 합 니까?그 럴 필요 없어.아마도 아래 상황 에서 당신 은 공장 방법 모델 을 사용 하 는 것 을 고려 할 수 있 습 니 다.
  • 클 라 이언 트 프로그램 이 사용 대상 의 생 성 과정 을 알 필요 가 없다.
  • 클 라 이언 트 프로그램 이 사용 하 는 대상 이 변동 할 가능성 이 있 거나 어떤 구체 적 인 대상 을 사용 하 는 지 전혀 모른다.
  • 총결산
    이상 은 이 글 의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.더 많은 내용 을 알 고 싶다 면 아래 링크 를 보 세 요.

    좋은 웹페이지 즐겨찾기