> 백엔드 개발 > PHP 튜토리얼 > PHP의 16가지 디자인 패턴 요약

PHP의 16가지 디자인 패턴 요약

零下一度
풀어 주다: 2023-03-10 17:50:01
원래의
2042명이 탐색했습니다.

참고: 이 튜토리얼은 모두 실험실 튜토리얼 [16가지 PHP 디자인 패턴에 대한 자세한 설명]에서 발췌했습니다. 일반적으로 사용되는 16가지 디자인 패턴의 기본 개념과 기술 포인트를 주로 소개하고 UML 클래스 다이어그램을 사용하여 간의 관계를 이해하는 데 도움을 줍니다. 각 디자인 패턴마다 PHP를 사용하여 코드 예제가 완성되어 있으므로 예제를 따라가면 쉽게 디자인 패턴을 시작할 수 있습니다.

1. 팩토리 패턴

팩토리 패턴은 세 가지 유형의 패턴으로 나눌 수 있습니다: 단순 팩토리 패턴, 팩토리 메소드 패턴, 추상 팩토리 패턴

1. 단순 팩토리 패턴

정적 팩토리 메소드라고도 함; 방법) ) 모드는 클래스 생성 모드에 속합니다. 단순 팩토리 패턴에서는 다양한 매개변수에 따라 다양한 클래스의 인스턴스가 반환될 수 있습니다. 간단한 팩토리 패턴은 다른 클래스의 인스턴스 생성을 담당하는 클래스를 구체적으로 정의합니다. 생성된 인스턴스에는 일반적으로 공통 상위 클래스가 있습니다.

Roles:

  • Factory 클래스: 특정 제품의 인스턴스 생성을 담당

  • Product 클래스: 제품 하위 클래스의 공개 인터페이스를 정의하는 추상 제품 클래스

  • ConcreteProduct 클래스: 구체적인 제품 클래스, 구현 Product 상위 클래스의 인터페이스 기능에 맞춤형 기능 추가 가능

UML 클래스 다이어그램:

PHP의 16가지 디자인 패턴 요약

샘플 코드:

<?php  
//简单工厂模式
class Cat
{
  function __construct()
  {
      echo "I am Cat class <br>";
  }
}
class Dog
{
  function __construct()
  {
      echo "I am Dog class <br>";
  }
}
class Factory
{
  public static function CreateAnimal($name){
      if ($name == 'cat') {
          return new Cat();
      } elseif ($name == 'dog') {
          return new Dog();
      }
  }
}

$cat = Factory::CreateAnimal('cat');
$dog = Factory::CreateAnimal('dog');
로그인 후 복사

간단한 팩토리 패턴의 가장 큰 장점은 생성과 객체 생성 분리를 사용하면 객체 생성이 전문 팩토리 클래스에 넘겨집니다. 그러나 가장 큰 단점은 팩토리 클래스가 유연성이 부족하여 새로운 특정 제품을 추가하려면 팩토리 클래스의 판단 논리 코드를 수정해야 한다는 것입니다. 제품이 많으면 팩토리 메소드 코드가 매우 복잡해집니다.

2. 팩토리 메소드 패턴

이 패턴에서는 추상 핵심 팩토리 클래스를 정의하고 제품 객체 생성을 위한 인터페이스를 정의함으로써 특정 제품 인스턴스 생성 작업이 팩토리 하위 클래스로 지연됩니다. 이것의 장점은 핵심 클래스가 팩토리 클래스의 인터페이스 정의에만 초점을 맞추고 특정 제품 인스턴스가 특정 팩토리 하위 클래스에 남겨져 생성된다는 것입니다. 시스템에 새 제품을 추가해야 하는 경우 기존 시스템 코드를 수정할 필요가 없으며 특정 제품 클래스와 해당 공장 하위 클래스만 추가하면 됩니다. 이렇게 하면 시스템의 확장성이 향상되고 열기 및 닫기 원칙을 준수하게 됩니다.

Role:

  • Product: 추상 제품 클래스

  • ConcreteProduct: 콘크리트 제품 ​​클래스

  • Factory: 추상 팩토리 클래스

  • ConcreteFactory: 콘크리트 팩토리 클래스

UML 클래스 다이어그램:

PHP의 16가지 디자인 패턴 요약

샘플 코드:

<?php  
interface Animal{
  public function run();
  public function say();
}
class Cat implements Animal
{
  public function run(){
      echo "I ran slowly <br>";
  }
  public function say(){
      echo "I am Cat class <br>";
  }
}
class Dog implements Animal
{
  public function run(){
      echo "I'm running fast <br>";
  }
  public function say(){
      echo "I am Dog class <br>";
  }
}
abstract class Factory{
  abstract static function createAnimal();
}
class CatFactory extends Factory
{
  public static function createAnimal()
  {
      return new Cat();
  }
}
class DogFactory extends Factory
{
  public static function createAnimal()
  {
      return new Dog();
  }
}

$cat = CatFactory::createAnimal();
$cat->say();
$cat->run();

$dog = DogFactory::createAnimal();
$dog->say();
$dog->run();
로그인 후 복사

팩토리 메소드 패턴은 간단한 팩토리 패턴을 더욱 추상화하고 일반화한 것입니다. 팩토리 메소드 패턴은 객체 지향 다형성을 사용하므로 단순한 팩토리 패턴의 장점은 유지하고 단점은 극복합니다. 팩토리 메서드 패턴에서 핵심 팩토리 클래스는 더 이상 모든 제품 생성을 담당하지 않고 특정 생성 작업을 하위 클래스에 맡깁니다. 이 핵심 클래스는 특정 팩토리가 구현해야 하는 인터페이스를 제공하는 역할만 담당하며 제품 클래스가 인스턴스화되는 방법에 대한 세부 사항은 담당하지 않습니다. 이를 통해 팩토리 메소드 패턴을 통해 시스템은 팩토리를 수정하지 않고도 새 제품을 도입할 수 있습니다. 역할.

3. 추상 팩토리 패턴

특정 클래스를 지정하지 않고 일련의 관련되거나 상호 의존적인 개체를 생성하기 위한 인터페이스를 제공합니다. 키트 패턴이라고도 알려진 추상 팩토리 패턴은 객체 생성 패턴입니다.

이 패턴은 팩토리 메소드 패턴을 더욱 확장한 것입니다. 팩토리 메소드 패턴에서는 특정 팩토리가 특정 유형의 제품, 즉 일대일 관계를 담당합니다. 그러나 특정 팩토리가 여러 제품 객체를 생산해야 하는 경우 추상 팩토리 패턴이 필요합니다. 사용됩니다.

이 모델의 이해를 돕기 위해 여기에는 두 가지 개념이 소개됩니다.

  • 제품 레벨 구조: 제품 레벨 구조는 제품의 상속 구조입니다. 예를 들어 추상 클래스는 TV입니다. 하위 클래스에는 Haier TV, Hisense For TVs 및 TCL TV가 포함되며 추상 TV와 특정 TV 브랜드 사이에 제품 계층 구조가 형성됩니다. 추상 TV는 상위 카테고리이고 특정 TV 브랜드는 하위 카테고리입니다.

  • 제품군: 추상적 공장 모델에서 제품군은 동일한 공장에서 생산되고 서로 다른 제품 수준 구조에 위치한 제품 그룹을 의미합니다(예: Haier 전기 기기 공장에서 생산되는 Haier TV 및 Haier 냉장고). 하이얼 TV는 TV 제품 계층에 위치하고 하이얼 냉장고는 냉장고 제품 계층에 위치합니다.

역할:

  • 추상 팩토리: 이 역할은 추상 팩토리 패턴의 핵심이며 애플리케이션 시스템의 비즈니스 로직과 아무 관련이 없습니다.

  • 具体工厂(Factory):这个角色直接在客户端的调用下创建产品的实例,这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统商业逻辑紧密相关的。

  • 抽象产品(AbstractProduct):担任这个角色的类是抽象工厂模式所创建的对象的父类,或它们共同拥有的接口

  • 具体产品(Product):抽象工厂模式所创建的任何产品对象都是一个具体的产品类的实例。

UML类图:

PHP의 16가지 디자인 패턴 요약

示例代码:

<?php  

interface TV{
  public function open();
  public function use();
}

class HaierTv implements TV
{
  public function open()
  {
      echo "Open Haier TV <br>";
  }

  public function use()
  {
      echo "I'm watching TV <br>";
  }
}

interface PC{
  public function work();
  public function play();
}

class LenovoPc implements PC
{
  public function work()
  {
      echo "I'm working on a Lenovo computer <br>";
  }
  public function play()
  {
      echo "Lenovo computers can be used to play games <br>";
  }
}

abstract class Factory{
  abstract public static function createPc();
  abstract public static function createTv();
}

class ProductFactory extends Factory
{
  public static function createTV()
  {
      return new HaierTv();
  }
  public static function createPc()
  {
      return new LenovoPc();
  }
}

$newTv = ProductFactory::createTV();
$newTv->open();
$newTv->use();

$newPc = ProductFactory::createPc();
$newPc->work();
$newPc->play();
로그인 후 복사

二、建造者模式

又名:生成器模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。

建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。例如,一辆汽车由轮子,发动机以及其他零件组成,对于普通人而言,我们使用的只是一辆完整的车,这时,我们需要加入一个构造者,让他帮我们把这些组件按序组装成为一辆完整的车。

角色:

  • Builder:抽象构造者类,为创建一个Product对象的各个部件指定抽象接口。

  • ConcreteBuilder:具体构造者类,实现Builder的接口以构造和装配该产品的各个部件。定义并明确它所创建的表示。提供一个检索产品的接口

  • Director:指挥者,构造一个使用Builder接口的对象。

  • Product:表示被构造的复杂对象。ConcreateBuilder创建该产品的内部表示并定义它的装配过程。
    包含定义组成部件的类,包括将这些部件装配成最终产品的接口。

UML类图:

PHP의 16가지 디자인 패턴 요약

示例代码:

<?php  
/**
* chouxiang builer
*/
abstract class Builder
{
  protected $car;
  abstract public function buildPartA();
  abstract public function buildPartB();
  abstract public function buildPartC();
  abstract public function getResult();
}

class CarBuilder extends Builder
{
  function __construct()
  {
      $this->car = new Car();
  }
  public function buildPartA(){
      $this->car->setPartA('发动机');
  }

  public function buildPartB(){
      $this->car->setPartB('轮子');
  }

  public function buildPartC(){
      $this->car->setPartC('其他零件');
  }

  public function getResult(){
      return $this->car;
  }
}

class Car
{
  protected $partA;
  protected $partB;
  protected $partC;

  public function setPartA($str){
      $this->partA = $str;
  }

  public function setPartB($str){
      $this->partB = $str;
  }

  public function setPartC($str){
      $this->partC = $str;
  }

  public function show()
  {
      echo "这辆车由:".$this->partA.','.$this->partB.',和'.$this->partC.'组成';
  }
}

class Director
{
  public $myBuilder;

  public function startBuild()
  {
      $this->myBuilder->buildPartA();
      $this->myBuilder->buildPartB();
      $this->myBuilder->buildPartC();
      return $this->myBuilder->getResult();
  }

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

$carBuilder = new CarBuilder();
$director = new Director();
$director->setBuilder($carBuilder);
$newCar = $director->startBuild();
$newCar->show();
로그인 후 복사

三、单例模式

单例模式,也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。

实现单例模式的思路是:一个类能返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用getInstance这个名称);当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用;同时我们还将该类的构造函数定义为私有方法,这样其他处的代码就无法通过调用该类的构造函数来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例。

---维基百科

单例模式的要点有:某个类只能有一个实例;它必须自行创建本身的实例;它必须自行向整个系统提供这个实例。单例模式是一种对象创建型模式。

角色:

  • Singleton:单例类

UML 类图:

PHP의 16가지 디자인 패턴 요약

示例代码:

<?php  

class Singleton
{
  private static $instance;
  //私有构造方法,禁止使用new创建对象
  private function __construct(){}

  public static function getInstance(){
      if (!isset(self::$instance)) {
          self::$instance = new self;
      }
      return self::$instance;
  }
  //将克隆方法设为私有,禁止克隆对象
  private function __clone(){}

  public function say()
  {
      echo "这是用单例模式创建对象实例 <br>";
  }
  public function operation()
  {
      echo "这里可以添加其他方法和操作 <br>";
  }
}

// $shiyanlou = new Singleton();
$shiyanlou = Singleton::getInstance();
$shiyanlou->say();
$shiyanlou->operation();

$newShiyanlou = Singleton::getInstance();
var_dump($shiyanlou === $newShiyanlou);
로그인 후 복사

上述的五个模式均属于创建型模式,关于结构型模式,点击【16个PHP设计模式详解】即可查看了……

위 내용은 PHP의 16가지 디자인 패턴 요약의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿