GOF - Factory method

octofox·2021년 5월 31일
0

GOF - Gang Of Four

목록 보기
4/6
post-thumbnail

Factory method

추상화

Factory method는 추상화 기법을 통해 패턴을 확장함으로 먼저 추상화에 대한 개념을 알아야 한다.

추상(抽象)은 사물을 정확하게 이해하기 위해서는 사물이 지니고 있는 여러 가지 측면 가운데서 특정한 측면만을 가려내어 포착하는 것이다.

구상의 반대말이라 한다.

추상화 작업은 코드를 요약하는 것

<?php
abstract class Factory
{
    public final function create($model)
    {
    	// 하위 클래스로 위임 (구현부에서 불러옴)
    	return $this->makeSometing($model);
    }
    // 추상 메서드 선언
    abstract public function makeSomething($model);
}

상세한 구현 코드는 무시한채 요약된 정보만 먼저 작성한다.
function create는 추상 factory를 물려받는 모든 구현 class에 존재하게 된다.
다른 모든 구현 class를 위한 공통 코드가 된 것이다.

<?php
// 팩토리 메서드 구현 부분
class productFactory extends Factory // extends를 통해 상속 받는다
{
    public function __construct()
    {
        echo __CLASS__."를 생성합니다.\n";
    }
    
    public function makeSomething($model) // 추상 메서드 오버라이딩
    {
        if($model == "LG"){
            return new LgProduct();
        }else if($model == "SAMSUNG"){
            return new SamsungProduct();
        }
    }
}

createProduct 부분을 하위 class에서 구현하는데로 상위 class의 공통 method(create)의 동작 방식이 바뀐게 된다.

<?php
// Lg 노트북 생성 클래스
class LgProduct
{
    public funtion name()
    {
        echo "LG Gram laptop";
    }
}
<?php
// 삼성 노트북 생성 클래스
class SamsungProduct
{
    public final funtion name()
    {
        echo "Samsung Always laptop";
    }
    
}
<?php
require "factory.php";
require "LgProduct.php";
require "SamsungProduct.php";
require "ProductFactory.php";

$fac = new ProductFactory;
$pro = $fac->create("LG"); // makeSomething method는 사용하지 않는다.
$pro->name();

$pro = $fac->create("SAMSUNG");
$pro->name();

abstract class를 구현했다는 것은 결국 재사용성을 늘리는 일이다.
여기서는 productFactory만 있지만 abstract Factory class를 상속 받는 다른 Factory를 만들어서 ex)foodFactory? 여러개의 factory가 공통 method로 다르게 작성 가능하여진다는 것이다. factory의 공통적인 부분도 살리고, 다형성도 살릴 수 있게 된다.
그리고 더하기 설명으로 makeSomthing 함수는 instance에서 사용되지 않지만 public으로 선언되어있다.
만약 private으로 설정된 property나 method가 있다면 상속되지않는다.
protect로는 설정해도 가능하다.(protect로 설정하게되면 instance에서는 접근하지 못한다.)
override 시에 접근지정자는 부모객체의 메소드보다 같거나 혹은 접근범위가 더 큰 접근지정자를 사용해야 한다.

결론

일반 factory pattern과 다른 점은 결국 추상화를 도입했다는 것이다.
추상화를 잘 이해하는 것이 이번 예제를 잘 이해했다고 할 수 있다.
추상과 구현, 그리고 공통된 것들을 뽑아내는 일반화.

추상화와 인터페이스는 서로 다르다.
interface class는 설계 규약만 표현 할 수 있는 반면에
abstract class는 method를 작성 할 수 있다.

abstract class가 implements 대신 extends를 사용하는 이유는 abstract class에서 구현한 method가 상속 가능하기 때문이다.

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

0개의 댓글