>백엔드 개발 >PHP 튜토리얼 >PHP에서 일반적으로 사용되는 6가지 디자인 패턴(요약 공유)

PHP에서 일반적으로 사용되는 6가지 디자인 패턴(요약 공유)

WBOY
WBOY앞으로
2022-04-24 11:50:5811680검색

이 글은 싱글턴 모드, 팩토리 모드, 등록 트리 모드, 전략 모드, 어댑터 모드, 관찰 등 6가지 주요 디자인 패턴과 관련된 이슈를 주로 소개하는 PHP에 대한 관련 지식을 제공합니다. 아래의 사용자 모드가 모든 사람에게 도움이 되기를 바랍니다.

PHP에서 일반적으로 사용되는 6가지 디자인 패턴(요약 공유)

추천 학습: "PHP 비디오 튜토리얼"

단일 케이스 모드

특징:

3개의 프라이빗과 한 개의 퍼블릭: 프라이빗 정적 변수(인스턴스 저장), 프라이빗 생성 방법( 인스턴스 생성 방지), 프라이빗 복제 방법(객체 복제 방지), 공용 정적 메소드(외부에 인스턴스 제공)

응용 시나리오:

프로그램 응용 프로그램에서 데이터베이스 작업이 포함될 때, 모든 작업 연결 데이터베이스에 많은 리소스를 소비하게 됩니다. 싱글톤 모드를 통해 고유한 데이터베이스 연결 개체를 생성할 수 있습니다.

<?phpclass Singleton{
    private static $_instance;
    private function __construct(){}
    private function __clone(){}
    public static function getInstance()
    {
        if(self::$_instance instanceof Singleton){//instanceof 判断一个实例是否是某个类的对象
            self::$_instance = new Singleton();
        }
        return self::$_instance;
    }}

Factory 패턴

특징:

생성된 객체에서 호출 객체를 분리하고 호출자가 직접 팩토리를 요청하여 코드 결합을 줄이고 시스템의 유지 관리성과 확장성을 향상시킵니다.

응용 시나리오:

객체를 생성하는 특정 메서드가 포함된 클래스를 제공하면 new를 직접 사용하지 않고도 팩토리 클래스를 사용하여 객체를 생성할 수 있습니다. 이렇게 하면 생성된 객체의 유형을 변경하려는 경우 팩토리만 변경하면 됩니다.

//假设3个待实例化的类class Aclass{}class Bclass{}class Cclass{}class Factory{
    //定义每个类的类名
    const ACLASS = &#39;Aclass&#39;;
    const BCLASS = &#39;Bclass&#39;;
    const CCLASS = &#39;Cclass&#39;;
    public static function getInstance($newclass)
    {
        $class = $newclass;//真实项目中这里常常是用来解析路由,加载文件。
        return new $class;
    }}//调用方法:Factory::getInstance(Factory::ACLASS);

등록 트리 패턴

특징:

등록 트리 패턴은 객체 인스턴스를 전역 객체 트리에 등록하고 필요할 때 객체 트리에서 선택하는 패턴 설계 방법입니다.

응용 프로그램:

싱글톤 모드, 팩토리 모드 또는 둘의 조합을 통해 개체를 생성하더라도 해당 개체는 모두 등록 트리에 "삽입"됩니다. 개체를 사용할 때 등록 트리에서 직접 가져옵니다. 이는 전역 변수를 사용하는 것만큼 편리하고 실용적입니다. 그리고 등록 트리 패턴은 다른 패턴에 대한 아주 좋은 아이디어도 제공합니다. (다음 예는 싱글톤, 팩토리, 등록 트리를 결합하여 사용하는 것입니다.)

//创建单例class Single{
    public $hash;
    static protected $ins=null;
    final protected function __construct(){
        $this->hash=rand(1,9999);
    }

    static public function getInstance(){
        if (self::$ins instanceof self) {
            return self::$ins;
        }
        self::$ins=new self();
        return self::$ins;
    }}//工厂模式class RandFactory{
    public static function factory(){
        return Single::getInstance();
    }}//注册树class Register{
    protected static $objects;
    public static function set($alias,$object){
        self::$objects[$alias]=$object;
    }
    public static function get($alias){
        return self::$objects[$alias];
    }
    public static function _unset($alias){
        unset(self::$objects[$alias]);
    }}//调用Register::set('rand',RandFactory::factory());$object=Register::get('rand');print_r($object);

전략 패턴

정의:

일련의 알고리즘을 정의하고, 각 알고리즘을 캡슐화하고, 상호 교환 가능하게 만듭니다. 전략 패턴을 사용하면 알고리즘을 사용하는 클라이언트와 독립적으로 알고리즘을 변경할 수 있습니다.

기능:

전략 패턴은 관련 알고리즘 계열을 관리하는 방법을 제공합니다. 전략 패턴은 상속 관계를 대체하는 방법을 제공합니다. 전략 패턴을 사용하면 여러 조건부 전송 문을 사용하지 않아도 됩니다.

애플리케이션 시나리오:

여러 클래스는 서로 다른 동작으로만 구별됩니다. 전략 모드를 사용하면 런타임에 실행할 특정 동작을 동적으로 선택할 수 있습니다. 예를 들어, 학교에 가는 방법에는 걷기, 버스, 지하철 등 다양한 전략이 있습니다...

abstract class Strategy{
    abstract function goSchool();}class Run extends Strategy{
    public function goSchool()
    {
        // TODO: Implement goSchool() method.
    }}class Subway extends Strategy{
    public function goSchool()
    {
        // TODO: Implement goSchool() method.
    }}class Bike extends Strategy{
    public function goSchool()
    {
        // TODO: Implement goSchool() method.
    }}class Context{
    protected $_stratege;//存储传过来的策略对象
    public function goSchoole()
    {
        $this->_stratege->goSchoole();
    }}//调用:$contenx = new Context();$avil_stratery = new Subway();$contenx->goSchoole($avil_stratery);

어댑터 패턴

특징:

완전히 다른 다양한 기능 인터페이스를 통합 API로 캡슐화합니다.

응용 프로그램:

PHP에는 MySQL, MySQLi 및 PDO의 세 가지 데이터베이스 작업이 있습니다. 이는 어댑터 모드를 사용하여 서로 다른 데이터베이스 작업을 동일한 API로 통합할 수 있습니다. 유사한 시나리오에는 Memcache, Redis, 파일, APC 등과 같은 다양한 캐시 기능을 일관된 기능으로 통합할 수 있는 캐시 어댑터가 포함됩니다.

abstract class Toy{
    public abstract function openMouth();

    public abstract function closeMouth();}class Dog extends Toy{
    public function openMouth()
    {
        echo "Dog open Mouth\n";
    }

    public function closeMouth()
    {
        echo "Dog close Mouth\n";
    }}class Cat extends Toy{
    public function openMouth()
    {
        echo "Cat open Mouth\n";
    }

    public function closeMouth()
    {
        echo "Cat close Mouth\n";
    }}//目标角色(红)interface RedTarget{
    public function doMouthOpen();

    public function doMouthClose();}//目标角色(绿)interface GreenTarget{
    public function operateMouth($type = 0);}//类适配器角色(红)class RedAdapter implements RedTarget{
    private $adaptee;

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

    //委派调用Adaptee的sampleMethod1方法
    public function doMouthOpen()
    {
        $this->adaptee->openMouth();
    }

    public function doMouthClose()
    {
        $this->adaptee->closeMouth();
    }}//类适配器角色(绿)class GreenAdapter implements GreenTarget{
    private $adaptee;

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

    //委派调用Adaptee:GreenTarget的operateMouth方法
    public function operateMouth($type = 0)
    {
        if ($type) {
            $this->adaptee->openMouth();
        } else {
            $this->adaptee->closeMouth();
        }
    }}class testDriver{
    public function run()
    {
        //实例化一只狗玩具
        $adaptee_dog = new Dog();
        echo "给狗套上红枣适配器\n";
        $adapter_red = new RedAdapter($adaptee_dog);
        //张嘴
        $adapter_red->doMouthOpen();
        //闭嘴
        $adapter_red->doMouthClose();
        echo "给狗套上绿枣适配器\n";
        $adapter_green = new GreenAdapter($adaptee_dog);
        //张嘴
        $adapter_green->operateMouth(1);
        //闭嘴
        $adapter_green->operateMouth(0);
    }}//调用$test = new testDriver();$test->run();

Observer 패턴

특징:

Observer 패턴(Observer)은 객체의 상태가 변경되면 이에 의존하는 모든 객체가 알림을 받고 자동으로 업데이트됩니다. 관찰자 패턴은 낮은 결합, 비침해적 알림 및 업데이트 메커니즘을 구현합니다.

애플리케이션:

이벤트가 발생한 후 일련의 업데이트 작업을 수행해야 합니다. 전통적인 프로그래밍 방법은 이벤트 코드 바로 뒤에 처리 로직을 추가하는 것입니다. 업데이트된 로직이 증가하면 코드 유지 관리가 어려워집니다. 이 방법은 결합되어 있으며 방해가 되므로 새 논리를 추가하려면 이벤트의 기본 코드를 수정해야 합니다.

// 主题接口interface Subject{
    public function register(Observer $observer);
    public function notify();}// 观察者接口interface Observer{
    public function watch();}// 主题class Action implements Subject{
    public $_observers=[];
    public function register(Observer $observer){
        $this->_observers[]=$observer;
    }

    public function notify(){
        foreach ($this->_observers as $observer) {
            $observer->watch();
        }

    }}// 观察者class Cat1 implements Observer{
    public function watch(){
        echo "Cat1 watches TV<hr/>";
    }}
 class Dog1 implements Observer{
     public function watch(){
         echo "Dog1 watches TV<hr/>";
     }
 }
 class People implements Observer{
     public function watch(){
         echo "People watches TV<hr/>";
     }
 }// 调用实例$action=new Action();$action->register(new Cat1());$action->register(new People());$action->register(new Dog1());$action->notify();

추천 학습: "PHP 비디오 튜토리얼"

위 내용은 PHP에서 일반적으로 사용되는 6가지 디자인 패턴(요약 공유)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제