간단하게 정리해뒀던 디자인패턴
디자인 패턴
팩토리(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 출력
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 프레임워크들에서 주로 사용
Author And Source
이 문제에 관하여(간단하게 정리해뒀던 디자인패턴), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@ein214/간단하게-정리해뒀던-디자인패턴저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)