GOF - Abstract factory

octofox·2021년 6월 1일
0

GOF - Gang Of Four

목록 보기
5/6
post-thumbnail

Abstract factory

abstract factory pattern은 이전에 알아본 패턴인 factory method pattern과 다르다고 말하기 민망할 정도로 같은 개념이다.

factory method pattern에서 그렇게 강조한 추상화 개념이 이미 Abstract(추상) factory pattern 이름에 들어가 있다.

추상화!! 정말 중요하다.
이쯤에서 추상화의 정의를 다시 보자.

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

우리 추상화를 정말 잘 생각해보자.
먼저 코드가 아닌 말로 현실세계를 설명해 보겠다.

현실 예시

이제 이 현실을 말로 추상화해보자

우리 동네에 자동차 공장이 2개 있다.
한국 자동차 공장, 미국 자동차 공장 (공장이라는 공통점)
이 두개의 공장은 타이어와 도어를 만든다.(공통점)

한국 타이어, 미국 타이어 (타이어라는 공통점)(한국과 미국이라는 특수성)
한국 도어, 미국 도어 (도어라는 공통점)(한국과 미국이라는 특수성)
한국 제품은 한국 방식, 미국 제품은 미국 방식으로 조립된다.(조립된다는 공통점)(한국과 미국이라는 특수성)

하지만 타이어와 도어의 조립 방식은 서로 다르다.(특수성, 여기서는 echo문만 다르게 찍어본다)

공통점은 abstract class로 구현하고
특수성은 하위 자식 class에서 구현한다

추상화 해보기

우선 2개의 공장의 공통점을 추상화하겠다.
추상화 공장: 타이어 만들기, 문 만들기.

<?php
// 추상 클래스
abstract class factory
{
    abstract public function createTire();
    abstract public function createDoor();
}

구현 코드는 각각의 다른 공장에 있다.

그리고 타이어의 공통점(조립된다)을 추상화해보자

<?php
class abstract TireProduct
{
    abstract public function makeAssemble(); // 부품은 조립된다.
}

이어서 도어도 추상화 한다.

<?php
class abstract DoorProduct
{
    abstract public function makeAssemble(); // 부품은 조립된다.
}

자 우리는 모든 공통점들을 상위 class에 추상화해서 정리해두었다.
이제 세세한 특수성은 자식 class에서 구현된다.

특수화 해보기

한국 공장을 특수화 해본다.

<?php
// 한국 공장
class KoreaFactory extends Factory
{
    public function createTire() // 오버라이딩
    {
    	return new KoreaTireProduct;
    }
    
    public function createDoor() // 오버라이딩
    {
    	return new KoreaDoorProduct;
    }
}

자 이렇게 해서 한국 공장은 한국산 제품만 만들게 되었다.
미국 공장도 특수화 하자

<?php
// 미국 공장
class StateFactory extends Factory
{
    public function createTire()
    {
    	return new StateTireProduct;
    }
    
    public function createDoor()
    {
    	return new StateDoorProduct;
    }
}

이 두개의 공장은 abstract class Factory를 상속 받아 같은 명령어를 쓰도록 강제되어있다!
한국 공장과 미국 공장에 "타이어 만들어" 라고 같은 명령을 내리지만 서로 다른 결과를 내보인다. 공통적인 명령이 특수성을 띈다.

타이어와 도어도 이어서 특수화 해보자

<?php
class KoreaTireProduct extends TireProduct
{
    public function makeAssemble()
    {
    	echo"한국형 타이어 조립!"; //특수화
    }
}

class StateTireProduct extends TireProduct
{
    public function makeAssemble()
    {
    	echo"미국형 타이어 조립!"; //특수화
    }
}

class KoreaDoorProduct extends DoorProduct
{
    public function makeAssemble()
    {
    	echo"한국형 문 조립!";
    }
}

class StateDoorProduct extends StateProduct
{
    public function makeAssemble()
    {
    	echo"미국형 문 조립!";
    }
}

실행 코드

이제 구현코드를 다 작성했다.
실행코드를 만들어 보자.

<?php
// 추상 팩토리 및 그룹 정의
require "Factory.php";
require "KoreaFactory.php";
require "StateFactory.php";

require "TireProduct.php";
require "DoorProduct.php";

require "KoreaTireProduct.php";
require "KoreaDoorProduct.php";

require "StateTireProduct.php";
require "StateDoorProduct.php";

// 한국 공장
$korea = new KoreaFactory;
$ko_tire = $korea->createTire();
$ko_door = $korea->createDoor();

$ko_tire->makeAssemble();
$ko_door->makeAssemble();

//미국 공장
$state = new StateFactory;
$us_tire = $state->createTire();
$us_door = $state->createDoor();

$us_tire->makeAssemble();
$us_door->makeAssemble();

결론

사실 패턴은 생각, 아이디어를 실현 시켜주는 것이지, 패턴에 맞게 생각하고 아이디어를 내는 것이 아니다.

요번에 우리는 공통점들을 찾아내서 추상화하고(Factory, TireProduct, DoorProduct)
한국과 미국에 맞게 차이점을 찾아내서 특수화 했다(KoreaFactory, StateFactory, KoreaTireProduct, StateTireProduct, KoreaDoorProduct, StateDoorProduct).

하는 일의 명칭은 같지만 행동 양식을 다르게 만들 수 있었다.
factory method의 확장 개념이라 딱히 새로울 것이 없었다.
우리는 우리가 원하는 만큼 추상화하면 된다.

공통점을 포착해서 일반화 하는 것이 제일 중요하다.

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

0개의 댓글