간단하게 정리해뒀던 디자인패턴

디자인 패턴

팩토리(Factory)

  • 가장 널리 사용되는 패턴
  • 클래스 하나가 원하는 클래스 객체를 생성해주는 패턴

예제코드

class AUtomobile
{
	private $vehicleMake;
	private $vehicleModel;

	public function __construct($make, $model)
	{
		$this->vehicleMake = $make;
		$this->vehicleModel = $model;
	}

	public function getMakeAndModel()
	{
		return $this->vehicleMake.' '.$this->vehicleModel;
	}
}

class AutomobileFactory()
{
	public static function create($make, $model)
	{
		return new Automobile($make, $model);
	}
}

//Automobile 객체를 생성하는 팩토리사용
$veyron = AutomobileFactory::create('Bugatti', 'Veyron');
	print_r($veyron->getMakeAndModel());//Bugatti Veyron 출력

이점

  • Automobile 클래스 이름을 바꾸거나 변경이 생기거나 다른 클래스로 대체해도 팩토리 클래스에 있는 create 함수만 바꾸면됨
  • 생성과정이 복잡한 클래스여도 작업을 팩토리 클래스에만 해주면됨

싱글턴

  • 특정 클래스에 대해 오직 하나의 인스턴스만 존재하며 모든 곳에서 그 인스턴스만 사용해야함
  • Configuration 클래스같은 전역객체, 이벤트 큐 같은 공유 리소스의 경우 싱글턴으로 작업함
  • 패턴의 특성상 어플리케이션 전체 범위에 영향을 주는 일종의 상태 정보가 생김 -> 테스트 가능성을 떨어트림 -> 대부분의 경우 싱글턴 클래스 대신 의존성 주입(Dependenct Injection)을 사용할 수 있으므로 싱글턴을 피하는 것이 좋음.

유의사항

  • 생성자 construct()는 new 연산자를 사용해서 다른 곳에서 함부로 생성할 수 없도록 protected로 제한
  • Magic Method __clone은 clone 연산자를 사용해서 복제할 수 없도록 private으로 제한되어 있음.
  • Magic Method __wakeup은 전역 함수 unserialize를 이용해서 할 수 없도록 private으로 제한되어 있음.
  • 새 인스턴스 생성 시에는 정적 메소드인 getInstance()내에서 지연된 정적 바인딩을 통해서 생성. Static 키워드를 사용함으로써 Singleton 클래스를 상속해서 싱글턴 패턴을 사용하는 자식 클래스들을 만듦

전략(Strategy)

  • 특정한 알고리즘을 캡슐화하여 사용하는 쪽에서는 알고리즘의 실제 구현에 대해 전혀 모르는채로도 실체화 하여 사용할 수 있음.
  • 두가지 목적
    - 각각 출력 클래스 구현체들이 준수해야하는 구현 규칙을 제공
    - 공통적으로 'OutputInterface' 인터페이스를 구현함으로서 타입힌팅을 통해 알고리즘을 사용하는 코드 쪽도 정확한 타입을 사용하도록 보장
  • 알고리즘의 캡슐화
<?php

interface OutputInterface
{
    public function load();
}

class SerializedArrayOutput implements OutputInterface
{
    public function load()
    {
        return serialize($arrayOfData);
    }
}

class JsonStringOutput implements OutputInterface
{
    public function load()
    {
        return json_encode($arrayOfData);
    }
}

class ArrayOutput implements OutputInterface
{
    public function load()
    {
        return $arrayOfData;
    }
}

---

class SomeClient
{
    private $output;

    public function setOutput(OutputInterface $outputType)
    {
        $this->output = $outputType;
    }

    public function loadOutput()
    {
        return $this->output->load();
    }
}

---
$client = new SomeClient();

// 배열 형태의 출력을 원한다면?
$client->setOutput(new ArrayOutput());
$data = $client->loadOutput();

// JSON 형태를 원한다면?
$client->setOutput(new JsonStringOutput());
$data = $client->loadOutput();

프론트 컨트롤러(Front Controller)

  • 웹 어플리케이션으로 오는 모든 리소스를 처리해주는 하나의 진입점을 두는 패턴
  • 컨트롤러에서 모든 의존 관계를 로딩하고 HTTP 요청을 처리한 후 응답을 보내주는것까지

MVC(Model-View-Controller)

  • MVC 패턴과 이 패턴의 변형이라고 할 수 있는 HMVC , MVVM 패턴은 어플리케이션 코드들을 특정 열할을 수행하는 논리적인 단위로 구분
  • PHP 프레임워크들에서 주로 사용

좋은 웹페이지 즐겨찾기