ホームページ  >  記事  >  バックエンド開発  >  3 つの PHP ファクトリー モードの簡単な紹介

3 つの PHP ファクトリー モードの簡単な紹介

黄舟
黄舟オリジナル
2017-11-13 14:20:195490ブラウズ

前回の記事では、PHPファクトリーパターンとは何か、そしてなぜPHPファクトリーパターンを使用する必要があるのか​​を紹介しました。今日は、PHPファクトリーパターンの3つの状況を詳しく紹介し、例を通して分析します。

ファクトリ パターン

実装: オブジェクト作成のためのインターフェイスを定義し、どのクラスをインスタンス化するかをサブクラスに決定させます。
適用シナリオ: 多くのサブクラスがあり、拡張され、作成方法がより複雑になります。

ファクトリ パターンには、シンプル ファクトリ、ファクトリ メソッド、抽象ファクトリの 3 種類があります。

3 種類のファクトリの違いは、抽象ファクトリには複数の製品ラインがあるのに対し、ファクトリ メソッドには 1 つの製品ラインしかないことです。これは抽象ファクトリーを簡略化したものです。ファクトリ メソッドはシンプル ファクトリの逆です。一見すると、多くのコードが追加されているように見えますが、ファクトリ メソッドはシンプル ファクトリと同じ機能を実装します。しかし本質的には、単純なファクトリーは 設計パターン の開閉原則に厳密に従っていないということです。新しい製品を追加する必要がある場合、ファクトリー コードも変更する必要があります。ただし、ファクトリ メソッドは開閉の原則に厳密に従っており、このモードは抽象的なファクトリ インターフェイスのみを担当し、特定のファクトリの拡張は顧客に任せられます。分業では、コアエンジニアが抽象的な工場や抽象的な製品の定義を担当し、ビジネスエンジニアが具体的な工場や具体的な製品の実装を担当します。抽象化層が適切に設計されている限り、フレームワークは非常に安定しています。

コードは次のとおりです:

/**
 * 工厂模式
 */
//抽象产品
interface Person {
    public function getName(); 
}
//具体产品实现
class Teacher implements Person {
    function getName() {
        return "老师n";
    }
}
class Student implements Person {
    function getName() {
        return "学生n";
    }
}
//简单工厂
class SimpleFactory {
       public static function getPerson($type) {
              $person = null;
              if ($type == 'teacher') {
                     $person = new Teacher();
              } elseif ($type == 'student') {
                     $person = new Student();
              }
              return $person;
       }
}
//简单工厂调用
class SimpleClient {
       function main() {
              // 如果不用工厂模式,则需要提前指定具体类
              // $person = new Teacher();
              // echo $person->getName();
              // $person = new Student();
              // echo $person->getName();
              // 用工厂模式,则不需要知道对象由什么类产生,交给工厂去决定
              $person = SimpleFactory::getPerson('teacher');
              echo $person->getName();
              $person = SimpleFactory::getPerson('student');
              echo $person->getName();
       }
}
//工厂方法
interface CommFactory {
    public function getPerson();
}
//具体工厂实现
class StudentFactory implements CommFactory {
    function getPerson(){
        return new Student();
    }
}
class TeacherFactory implements CommFactory {
    function getPerson() {
        return new Teacher();
    }
}
//工厂方法调用
class CommClient {
    static function main() {
           $factory = new TeacherFactory();
           echo $factory->getPerson()->getName();
           $factory = new StudentFactory();
           echo $factory->getPerson()->getName();
    }
}
//抽象工厂模式另一条产品线
interface Grade {
       function getYear();
}
//另一条产品线的具体产品
class Grade1 implements Grade {
       public function getYear() {
              return '2003级';
       }
}
class Grade2 implements Grade {
       public function getYear() {
              return '2004级';
       }
}
//抽象工厂
interface AbstractFactory {
       function getPerson();
       function getGrade();
}
//具体工厂可以产生每个产品线的产品
class Grade1TeacherFactory implements AbstractFactory {
       public function getPerson() {
              return new Teacher();
       }
       public function getGrade() {
              return new Grade1();
       }
}
class Grade1StudentFactory implements AbstractFactory {
       public function getPerson() {
              return new Student();
       }
       public function getGrade() {
              return new Grade1();
       }
}
class Grade2TeacherFactory implements AbstractFactory {
       public function getPerson() {
              return new Teacher();
       }
       public function getGrade() {
              return new Grade2();
       }
}
//抽象工厂调用
class FactoryClient {
       function printInfo($factory) {
              echo $factory->getGrade()->getYear().$factory->getPerson()->getName();
       }
       function main() {
              $client = new FactoryClient();
              $factory = new Grade1TeacherFactory();
              $client->printInfo($factory);
              $factory = new Grade1StudentFactory();
              $client->printInfo($factory);
              $factory = new Grade2TeacherFactory();
              $client->printInfo($factory);
       }
}
//简单工厂
//SimpleClient::main();
//工厂方法
//CommClient::main();
//抽象工厂
FactoryClient::main();

概要:

この記事の例を通して、PHP ファクトリー モードが非常に簡単であることを理解できたと思います。仕事!

関連する推奨事項:

php Factory パターンとは何ですか?なぜphpファクトリーモードを使用するのでしょうか?

PHPファクトリーモードの3つの形式のサンプルコードを詳しく解説

PHPファクトリーモードの使用例まとめ

以上が3 つの PHP ファクトリー モードの簡単な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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