[녹풍]원문은 How To Create a PHP Factory Pattern 이다.

MVC를 만드는 것은 내가 새로운 프로그래밍 컨셉을 많이 배울 수 있게 해 줬다. 그들 중 팩토리 패턴이라는 것이 있다. 프로그래밍 패턴이 필수는 아니다. 패턴은 특정 문제를 해결하기 위한 가장 간단한 방법이다. 이 말은 다른 방법으로도 같은 문제를 해결할 수 있다는 말이다. 다만, 패턴은 목표를 성취하게 해 주는 가장 효과적인 방법이라고 할 수 있다.

오늘은 팩토리 패턴을 살펴볼 것이다. 현실에서 공장(Factory)은 물건을 만든다. 비슷하게, 팩토리 패턴에서 ‘팩토리’가 객체를 만든다.

팩토리 패턴 만들기

이걸 설명하기 위해, 일반적으로 우리가 객체를 만들고 사용하는 방법을 살펴 보자.

<?php
$oUser = new User();
$oUser->start();
?>

위 코드는 User 객체를 만들고 start 함수를 실행한다. 팩토리 패턴은 코드 한 줄로 같은 일을 할 수 있게 해 준다.

이렇게 한다.

<?php
class User
{
    public static function factory()
    {
        return new __CLASS__;
    }
    public function start() { ... }
}

User::factory()->start();
?>

위의 factory 함수는 객체를 만들고 반환한다. __CLASS__ 는 클래스 이름을 지칭하는 매직 상수다. 이 경우에는 “User”를 지칭하는 게 되겠다. 따라서, factory 함수는 User 객체를 리턴한다.

이 함수가 스태틱 함수고, 원할 때는 언제든 호출할 수 있다는 점이 아주 중요하다. (factory 함수라는 이름이 중요한 게 아니라.)

객체를 리턴함으로써, 우리는 간단한 함수 체인을 사용할 수 있고, 코드를 한 줄로 만들 수 있다.

이 이걸 사용하는 게 좋을까?

물론, 팩토리 패턴을 (단지 자기 자신만이 아니라) 모든 클래스의 모든 객체를 만들기 위해 사용할 수도 있다. 이 경우에, 이름에 기반해 객체를 만들기 위해 팩토리 함수에 클래스 이름 파라미터를 넘겨 준다.

아래 예제를 보라.

<?php
class Builder
{
    public static function factory($sClassName)
    {
        return new $sClassName;
    }
}

$oUser = Builder::factory("User");
?>

이 패턴이 어떤 쓸모가 있을지 머리를 싸매지 말고, 이 패턴이 우리가 좀더 쉽게 일하도록 해 준다는 점을 상기하라. 만약 당신이 객체와 클래스를 다룬다면, 당신은 결국 팩토리 패턴을 사용할 때 완벽하게 처리할 수 있는 그런 상황에 직면할 것이다.

팩토리 패턴은 다른 객체나 클래스의 상태에 기반해 다른 방식으로 객체를 초기화하고 싶을 때 특별히 유용할 것이다. [1,2,3에 따라 각기 다른 객체를 생성한다거나 하는 거.] 이런 경우, 팩토리 클래스는 객체를 올바른 방식으로 초기화할 수 있다. [팩토리 패턴을 사용해야 하는] 또다른 이유는 초기화하려는 객체에 기반해 올바른 파일을 자동으로 불러온다는 점이 되겠다.

팩토리 패턴에 대해 더 알고 싶다면, PHP 공식 문서를 강력히 추천한다. 질문이 있다면 댓글 남겨라.