GOF - Factory

octofox·2021년 5월 29일
0

GOF - Gang Of Four

목록 보기
3/6
post-thumbnail

Factory

factory 패턴은 객체들간의 강력한 의존 관계를 보다 느슨하게 만들기 위함이다.

factory 패턴은 한곳의 class에서 작성되는 것이 아니다.
서로 의존 관계에 있는 class들 사이에서 사용된다.

우리 대부분은 new 키워드와 클래스 이름을 하드코딩으로 작성한다.
그래서 변경사항이 생기면 하드코딩으로 작성된 곳을 다 수정해야하는 불편함이 생긴다.

그래서 factory(공장) 패턴으로 class 생성을 담당하는 class를 작성 할 수 있다.

class 생성을 class에 위임한다라… 머리에서 잘 그려지지 않는다.

factory class는 생성할 class의 instance를 반환하는 method를 가지고 있다. 이 method는 static으로 작성되어 있다.

class Factory
{
    static public function getInstance()
    {
        return new Korean();
    }
}
class Hello
{
    public function greeting()
    {
        // $ko = new Korean();
        $lang = Factory::getInstance(); // 팩토리 호출
        return $lang->text;
    }
}
class Korean
{
    public function text()
    {
        return “안녕하세요”;
    }
}

위의 코드는 factory에 class 생성을 위임한 코드다.
다만 아직 instance를 동적으로 생성하고 있지는 않다.
현재 Factory class가 Hello class, Korean class의 의존성을 책임지고 있는 것이다.

이것을 동적으로 생성하기 위해서는 조건문이 필요하다.

한국어 인사말이 있으니 영어 인사말 클래스를 만들겠다.

그리고

Hello class의 greeting method 내부에 $type변수를 주고 Factory class의 getInstance method에 넘겨주겠다.

class Factory
{
    static public function getInstance($type = null)
    {
        if($type == ‘ko’){
            return new Korean();
        } else if ($type == ‘en’){
            return new English();
        }
       
    }
}
class Hello
{
    public function greeting($type)
    {
        // $ko = new Korean();
        $lang = Factory::getInstance($type); // 팩토리 호출
        return $lang->text;
    }
}
class Korean
{
    public function text()
    {
        return “안녕하세요”;
    }
}
class English
{
    public function text()
    {
        return “Hello”;
    }
}

자 이제는 factory class가 $type 값에 따라 동적으로 선택적으로 호출이 가능해졌다.

<?php
include ‘factory.php’;
include ‘hello.php’;
include ‘korean.php’;
include ‘english.php’;

$obj = new Hello();

echo $obj -> greeting(‘ko’);
echo $obj -> greeting(‘en’);

장점

  1. 코드에서 생성과 관련된 모든 처리를 별도의 class에 위임할 수 있다. 사용과 생성을 분리하는 과정에서 중복된 코드를 정리하는 효과도 있다.
  2. 유연성과 확장성이 개선된다. 개발과정에서 class이름이 변경되어도 코드를 일일이 수정하지 않고 factory instance를 통해 손쉽게 변경 가능하다.
  3. factory pattern은 어떤 객체를 생성할지 모르는 초기 단계의 코드에 매우 유용하다. 객체를 먼저 호출해서 사용한다음 손쉽게 수정 가능하기 때문이다.

단점

factory pattern은 객체 생성을 위임하는 별도의 새로운 클래스가 필요하다. 관리할 클래스 파일이 늘어난다. 이러는 것이 싫다면 단순 팩토리를 사용 할 수 있다.

결론

사진과 같은 1 대 N 관계와 같은 구조에서 사용하면 좋다.
지금 알아본 기본 factory pattern은 다른 factory pattern들
factory method pattern, abstrac factory pattern을 알아가는 연장선이 된다.

profile
개발자라고 우기는 노답 소년

0개의 댓글