본문 바로가기
프로그램개발

PHP로 구현하는 디자인 패턴 마스터하기: 코드 품질 향상과 유지보수성 극대화

by TLOG 2023. 4. 14.
반응형

PHP 언어를 이용한 디자인 패턴 

디자인 패턴은 소프트웨어 개발에서 반복적으로 발생하는 문제들에 대한 해결책을 제공합니다. 디자인 패턴은 객체지향 프로그래밍의 원칙을 지키면서 개발을 돕기 때문에, 유지보수와 확장성이 용이한 코드를 작성할 수 있습니다. PHP를 이용한 디자인 패턴에 대해 알아봅시다.

 

디자인 패턴

 

1.싱글턴 패턴 (Singleton Pattern)

싱글턴 패턴은 특정 클래스의 인스턴스가 하나만 존재하도록 보장하는 패턴입니다. 데이터베이스 연결이나 로그 파일 작성 같은 경우, 하나의 인스턴스만 필요하므로 싱글턴 패턴을 사용할 수 있습니다.

class Singleton {
    private static $instance;

    private function __construct() {}

    public static function getInstance() {
        if (self::$instance === null) {
            self::$instance = new self();
        }

        return self::$instance;
    }
}

 

2.팩토리 메소드 패턴 (Factory Method Pattern)
팩토리 메소드 패턴은 객체 생성을 캡슐화하여 구체적인 클래스를 사용자로부터 분리하는 패턴입니다. 객체 생성 로직을 수정해야 할 경우, 팩토리 메소드만 수정하면 되므로 유지보수가 용이합니다.

interface Product {
    public function getName();
}

class ConcreteProductA implements Product {
    public function getName() {
        return 'Product A';
    }
}

class ConcreteProductB implements Product {
    public function getName() {
        return 'Product B';
    }
}

abstract class Creator {
    abstract public function factoryMethod(): Product;
}

class ConcreteCreatorA extends Creator {
    public function factoryMethod(): Product {
        return new ConcreteProductA();
    }
}

class ConcreteCreatorB extends Creator {
    public function factoryMethod(): Product {
        return new ConcreteProductB();
    }
}

 

3.추상 팩토리 패턴 (Abstract Factory Pattern)
추상 팩토리 패턴은 서로 관련 있는 여러 객체를 생성하는 인터페이스를 정의하는 패턴입니다. 이 패턴은 여러 팩토리 메소드 패턴을 캡슐화하여 사용합니다.

interface Button {
    public function render();
}

class WindowsButton implements Button {
    public function render() {
        return 'Windows Button';
    }
}

class MacButton implements Button {
    public function render() {
        return 'Mac Button';
    }
}

interface GUIFactory {
    public function createButton(): Button;
}

class WindowsFactory implements GUIFactory {
    public function createButton(): Button {
        return new WindowsButton();
    }
}

class MacFactory implements GUIFactory {
    public function createButton(): Button {
        return new MacButton();
    }
}

 

4.빌더 패턴 (Builder Pattern)
빌더 패턴은 복잡한 객체를 단계별로 구축하는 법을 정의하는 패턴입니다. 이 패턴은 객체의 생성 과정과 표현 방법을 분리하여 동일한 생성 절차에서 서로 다른 표현 결과를 만들 수 있습니다.

class Product {
    private $parts = [];

    public function add($part) {
        $this->parts[] = $part;
    }

    public function listParts() {
        return implode(', ', $this->parts);
    }
}

interface Builder {
    public function producePartA();
    public function producePartB();
    public function producePartC();
}

class ConcreteBuilder implements Builder {
    private $product;

    public function __construct() {
        $this->reset();
    }

    public function reset() {
        $this->product = new Product();
    }

    public function producePartA() {
        $this->product->add('Part A');
    }

    public function producePartB() {
        $this->product->add('Part B');
    }

    public function producePartC() {
        $this->product->add('Part C');
    }

    public function getProduct(): Product {
        $result = $this->product;
        $this->reset();

        return $result;
    }
}

class Director {
    private $builder;

    public function setBuilder(Builder $builder) {
        $this->builder = $builder;
    }

    public function buildMinimalViableProduct() {
        $this->builder->producePartA();
    }

    public function buildFullFeaturedProduct() {
        $this->builder->producePartA();
        $this->builder->producePartB();
        $this->builder->producePartC();
    }
}

 

5.프로토타입 패턴 (Prototype Pattern)
프로토타입 패턴은 기존 객체를 복사하여 새로운 객체를 생성하는 패턴입니다. 객체 생성 비용이 높을 때 사용하며, 원본 객체와 독립적으로 객체를 복제할 수 있습니다.

interface Prototype {
    public function clone(): Prototype;
}

class ConcretePrototype implements Prototype {
    public $data;

    public function __construct($data) {
        $this->data = $data;
    }

    public function clone(): Prototype {
        return clone $this;
    }
}

 

6.어댑터 패턴 (Adapter Pattern)
어댑터 패턴은 서로 호환되지 않는 인터페이스를 갖는 클래스들을 함께 사용할 수 있게 하는 패턴입니다. 클래스의 인터페이스를 사용자가 기대하는 다른 인터페이스로 변환합니다.

interface Target {
    public function request(): string;
}

class Adaptee {
    public function specificRequest(): string {
        return 'Specific Request';
    }
}

class Adapter implements Target {
    private $adaptee;

    public function __construct(Adaptee $adaptee) {
        $this->adaptee = $adaptee;
    }

    public function request(): string {
        return $this->adaptee->specificRequest();
    }
}

이 외에도 많은 디자인 패턴이 있으며, 개발 상황에 맞춰 적절한 패턴을 사용하면 코드의 유지보수와 확장성이 향상됩니다. 다음은 그 중 일부입니다.

 

7.데코레이터 패턴 (Decorator Pattern)
데코레이터 패턴은 객체에 동적으로 새로운 기능을 추가할 수 있는 패턴입니다. 기존 클래스를 수정하지 않고 객체의 기능을 확장할 수 있습니다.

interface Component {
    public function operation(): string;
}

class ConcreteComponent implements Component {
    public function operation(): string {
        return 'ConcreteComponent';
    }
}

abstract class Decorator implements Component {
    protected $component;

    public function __construct(Component $component) {
        $this->component = $component;
    }
}

class ConcreteDecoratorA extends Decorator {
    public function operation(): string {
        return 'ConcreteDecoratorA(' . $this->component->operation() . ')';
    }
}

class ConcreteDecoratorB extends Decorator {
    public function operation(): string {
        return 'ConcreteDecoratorB(' . $this->component->operation() . ')';
    }
}

 

8.퍼사드 패턴 (Facade Pattern)
퍼사드 패턴은 복잡한 서브시스템에 대한 통합 인터페이스를 제공하는 패턴입니다. 서브시스템을 쉽게 사용할 수 있는 단순한 인터페이스를 제공합니다.

class SubsystemA {
    public function operationA() {
        return 'Subsystem A';
    }
}

class SubsystemB {
    public function operationB() {
        return 'Subsystem B';
    }
}

class Facade {
    private $subsystemA;
    private $subsystemB;

    public function __construct(SubsystemA $subsystemA, SubsystemB $subsystemB) {
        $this->subsystemA = $subsystemA;
        $this->subsystemB = $subsystemB;
    }

    public function operation() {
        $result = $this->subsystemA->operationA() . ', ' . $this->subsystemB->operationB();
        return $result;
    }
}

 

9.옵저버 패턴 (Observer Pattern)
옵저버 패턴은 객체의 상태 변화를 관찰하는 관찰자들에게 상태 변화를 통보하는 패턴입니다. 한 객체의 상태가 변경되었을 때 다른 객체들에게 알릴 수 있습니다.

interface Observer {
    public function update(string $state);
}

class ConcreteObserverA implements Observer {
    public function update(string $state) {
        echo 'ConcreteObserverA: ' . $state . PHP_EOL;
    }
}

class ConcreteObserverB implements Observer {
    public function update(string $state) {
        echo 'ConcreteObserverB: ' . $state . PHP_EOL;
    }
}

class Subject {
    private $observers = [];
    private $state;

    public function attach(Observer $observer) {
        $this->observers[] = $observer;
    }

    public function setState(string $state) {
        $this->state = $state;
        $this->notify();
    }

    private function notify() {
        foreach ($this->observers as $observer) {
            $observer->update($this->state);
        }
    }
}

10.전략 패턴 (Strategy Pattern)
전략 패턴은 알고리즘을 캡슐화하여 알고리즘 간 교체가 용이하게 하는 패턴입니다. 알고리즘을 사용하는 클라이언트와 독립적으로 알고리즘을 수정하거나 교체할 수 있습니다.

 

interface Strategy {
    public function execute(int $a, int $b): int;
}

class ConcreteStrategyAdd implements Strategy {
    public function execute(int $a, int $b): int {
        return $a + $b;
    }
}

class ConcreteStrategySubtract implements Strategy {
    public function execute(int $a, int $b): int {
        return $a - $b;
    }
}

class ConcreteStrategyMultiply implements Strategy {
    public function execute(int $a, int $b): int {
        return $a * $b;
    }
}

class Context {
    private $strategy;

    public function __construct(Strategy $strategy) {
        $this->strategy = $strategy;
    }

    public function executeStrategy(int $a, int $b): int {
        return $this->strategy->execute($a, $b);
    }
}

디자인 패턴은 개발 과정에서 자주 발생하는 문제들을 해결하기 위한 솔루션입니다. PHP 언어로 구현된 디자인 패턴을 사용하면 코드의 유지보수와 확장성을 향상시킬 수 있습니다. 상황에 따라 적절한 디자인 패턴을 적용하여 더 효율적인 소프트웨어 개발을 경험해보세요.

 

 부산홈페이지제작

 

 

https://tlog.kr 

 

부산홈페이지제작 | 티로그 - 부산 최고의 웹디자인과 개발 서비스

부산홈페이지제작 전문업체 티로그 - 창의적이고 전문적인 웹 디자인과 개발 서비스로 귀하의 비즈니스에 새로운 가치를 더합니다. 부산 지역의 다양한 비즈니스 요구에 맞춘 맞춤형 웹 솔루션

tlog.kr

 

https://youtu.be/ihHdOOlsNws

 

 

https://www.tlogcorp.com 

 

비용 절감 팁 공개 | 부산홈페이지제작 티로그

커스텀 홈페이지 제작과 가격부담 없는 그누보드테마를 원하는 분들에게 이상적인 선택입니다. 고객이 요구하는 모든 요소를 고려하여 최적의 웹사이트를 제공해드립니다.

www.tlogcorp.com

 

 

반응형

댓글