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();
?>
공장 모델 은 주로 창설 대상 에 게 과도 인 터 페 이 스 를 제공 하여 창설 대상 의 구체 적 인 과정 을 차단 하고 격 리 시 켜 유연성 을 높이 는 목적 을 달성한다.공장 모델 은 세 가지 로 나 눌 수 있다.
간단 한 공장 모델 은 정적 공장 방법 모델 이 라 고도 부른다.이름 에서 알 수 있 듯 이 이 모델 은 틀림없이 매우 간단 할 것 이다.그것 이 존재 하 는 목적 은 매우 간단 하 다.대상 을 만 드 는 데 사용 할 인 터 페 이 스 를 정의 하 는 것 이다.
공장 방법 모델 은 간단 한 공장 모델 에서 공장 방법의 정적 속성 을 제거 하여 이불 류 를 계승 할 수 있 게 한다.이렇게 간단 한 공장 모델 에서 공장 방법 에 집중 되 는 압력 은 공장 방법 모델 에서 서로 다른 공장 서브 클래스 가 분담 할 수 있다.
공장 방법 모델 은 대상 의 생 성 을 완벽 하 게 포장 한 것 처럼 고객 프로그램 에서 추상 적 인 제품 역할 이 제공 하 는 인터페이스 만 처리 하도록 한다.그럼 우 리 는 반드시 코드 에 공장 을 널리 퍼 뜨 려 야 합 니까?그 럴 필요 없어.아마도 아래 상황 에서 당신 은 공장 방법 모델 을 사용 하 는 것 을 고려 할 수 있 습 니 다.
이상 은 이 글 의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.더 많은 내용 을 알 고 싶다 면 아래 링크 를 보 세 요.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Laravel - 변환된 유효성 검사 규칙으로 API 요청 제공동적 콘텐츠를 위해 API를 통해 Laravel CMS에 연결하는 모바일 앱(또는 웹사이트) 구축을 고려하십시오. 이제 앱은 CMS에서 번역된 콘텐츠를 받을 것으로 예상되는 다국어 앱이 될 수 있습니다. 일반적으로 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.