Design pattern/생성 패턴

[디자인패턴] 3장 팩토리 메서드 패턴

미스터로즈 2021. 4. 28. 22:25

공부 하기 위해서 요약 정리 해놓은 것입니다..

 

정확하고 꼼꼼한 자료는 쉽게 배워 바로 써먹는 디자인 패턴을 확인 하시고

코드는 github.com/infohojin/patterns 을 참고해 주세요.

 

팩토리 메서드 패턴은 팩토리 패턴의 확장 패턴으로 팩토리 패턴과 템플릿 메서드 패턴이 결합된 패턴입니다.

 

팩토리 메서드는 추상화 기법을 사용하여 패턴을 확장하므로 추상화에 대한 개념을 알아야 합니다.

 

추상화 작업은 코드를 요약하는 것입니다. 

 

추상화 작업을 위해서는 요약된 정보와 실제 구현부를 분리합니다.

 

class 키워드 앞에 abstract 키워드를 붙여 추상 클래스를 작성합니다.

패턴 확장

<?php
/**
 * 팩토리 추상화
 */
abstract class Factory
{
    public final function create()
    {
        // return new LgProduct();
        // 하위 클래스로 위임
        return $this->createProduct();
    }

    // 추상 메소드 선언
    abstract public function createProduct();
}
<?php
/**
 * 팩토리(Factory)
 */
require "factory.php";
require "LgProduct.php";
require "ProductFactory.php";

$fac = new ProductFactory;
$pro = $fac->create();
$pro->name();
<?php
/**
 * 팩토리 메소드 구현부분
 */
class ProductFactory extends Factory
{
    public function __construct()
    {
        echo __CLASS__."를 생성합니다.\n";
    }

    public function createProduct()
    {
        return new LgProduct();
    }
}

 

추상클래스는 하위 클래스로 위임을 해줍니다.

 

팩토리 메서드 패턴과 템플릿 메서드 패턴에는 유사한 동작이 있습니다.

 

두 패턴 모두 추상화를 사용해 객체를 생성한다는 것입니다. 즉, 상위클래스에서 정의를 결정하고 하위 클래스에 구체적인 처리를 위임한다는 것입니다.

 

상위 클래스

일반 클래스가 추상화로 변경되면 클래스는 추상클래스와 구현 클래스로 분리됩니다.

 

추상클래스란 abstract 키워드를 이용해 변경된 타입 클래스를 말합니다.

 

위임을 통해 분리된 하위 클래스는 실제 내용을 자유롭게 변경하거나 처리할 수 있는 느슨한 관계를 갖게 됩니다.

 

추상 클래스가 implements 대신 extends를 사용하는 것도 상속이라는 특징 때문입니다.

 

추상 클래스도 메서드를 구현해 하위 클래스에서 필요한 기능을 전달할 수 있습니다.

 

상위 클래스는 구조화된 뼈대를 형성하는 역활을 하며,

 

하위 클래스는 선언한 뼈대를 바탕으로 실제 구현부를 작성합니다.

 

하위 클래스

추상 클래스 + 구현 클래스로 분리가 됩니다..

 

추상 클래스를 상속받는 경우, 반드시 하위 메서드에서 실제 구현부를 작성해야 합니다.

 

이는 강제적 의무 사항입니다.

 

이는 마치 인터페이스 규약과 비슷합니다.

 

객체지향의 다형성은 구현 객체를 규격에 맞게 다양한 형태로 구현할 수 있는 것을 의미합니다.

 

다형성을 처리하기 위해서는 인터페이스 처리가 필요합니다.

 

다형성의 특징과 추상화 기법을 응용하면 상속받은 클래스마다 다른 기능의 메서드를 구현할 수 있습니다.

 

개방 - 폐쇄 원칙 은 객체지향의 설계 원칙 중 하나로, 바뀌지 않는 공통된 부분을 분리하여 관리합니다.

 

이를 적용하는 방법이 다형성 입니다.

 

매개변수

객체 생성 과정을 분리함으로써 다양한 객체 생성을 처리할 수 있는데, 이때 객체 생성을 매개변수화하여 선택적으로 생성할 수도 있습니다.

 

택토리 패턴은 객체 생성을 분리된 클래스로 위임하는 반면 팩토리 메서드는 추상화를 통해 정의와 구현을 재분리 합니다.

 

실제적인 객체 생성은 재분리된 하위 클래스에서 이루어집니다.

 

팩토리 패턴에서는 객체를 선택 생성하는 방법에 대해 알아보았습니다.

 

팩토리 메서드 패턴은 매개변수를 이용해 다양한 객체를 선택 생성할 수 있습니다. 

 

또한 추상클래스를 상속받아 하위 클래스를 추가하며,

 

객체의 생성을 군집화 하고 군집된 객체를 매개변수로 선택합니다.

 

<?php
/**
 * 팩토리 메소드 구현부분
 */
class ProductFactory extends Factory
{
    public function __construct()
    {
        echo __CLASS__."를 생성합니다.\n";
    }

    public function createProduct($model)
    {
        if($model == "LG") {
            return new LgProduct();
        } else if($model == "SAMSUNG") {
            return new SamsungProduct();
        }
        
    }
}