ホームページ  >  記事  >  バックエンド開発  >  PHPの16のデザインパターンまとめ

PHPの16のデザインパターンまとめ

零下一度
零下一度オリジナル
2017-06-23 14:40:051995ブラウズ

注: このチュートリアルはすべて、実験室チュートリアル [16 の PHP デザイン パターンの詳細な説明] からの抜粋です。主に、一般的に使用される 16 のデザイン パターンの基本概念と技術的なポイントを紹介し、UML クラス図を使用して、それらの関係を理解するのに役立ちます。デザイン パターンのさまざまなクラスでは、PHP を使用してコード サンプルが完成されており、サンプルに従うことで簡単にデザイン パターンを開始できます。

1. ファクトリ パターン

ファクトリ パターンは、単純なファクトリ パターン、ファクトリ メソッド パターン、抽象的なファクトリ パターンの 3 種類のパターンに分類できます。 Method) ) モード。クラス作成モードに属します。単純なファクトリ パターンでは、さまざまなパラメータに従ってさまざまなクラスのインスタンスを返すことができます。単純なファクトリ パターンは、他のクラスのインスタンスの作成を担当するクラスを具体的に定義します。作成されたインスタンスには通常、共通の親クラスがあります。

役割:

ファクトリクラス: 特定の製品のインスタンスの作成を担当します

  • 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. 抽象ファクトリ パターン

特定のクラスを指定せずに、一連の関連オブジェクトまたは相互依存オブジェクトを作成するためのインターフェイスを提供します。 Abstract Factory パターンは、キット パターンとも呼ばれ、オブジェクト作成パターンです。

このパターンは、ファクトリ メソッド パターンをさらに拡張したものです。ファクトリ メソッド パターンでは、特定のファクトリが特定の種類の製品の生産を担当します。つまり、1 対 1 の関係ですが、特定のファクトリが複数の製品オブジェクトを生産する必要がある場合、抽象ファクトリ パターンが必要になります。使用されること。

このモデルの理解を容易にするために、ここでは 2 つの概念を紹介します:

製品レベルの構造
    : 製品レベルの構造は、製品の継承構造です。たとえば、抽象クラスはテレビです。そのサブクラスには、Haier TV、Hisense For TV、および TCL 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 中国語 Web サイトの他の関連記事を参照してください。

    声明:
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。