>  기사  >  백엔드 개발  >  세 가지 PHP 팩토리 모드에 대한 간략한 소개

세 가지 PHP 팩토리 모드에 대한 간략한 소개

黄舟
黄舟원래의
2017-11-13 14:20:195427검색

저번 글에서는 PHP팩토리 패턴이 무엇인지, 왜 PHP 팩토리 패턴을 사용해야 하는지에 대해 소개해 드렸습니다. 오늘은 PHP 팩토리 패턴의 세 가지 상황을 자세히 소개하고 예제를 통해 분석해보겠습니다!

Factory Pattern

구현: 객체 생성을 위한 인터페이스를 정의하고 하위 클래스가 인스턴스화할 클래스를 결정하도록 합니다.
응용 시나리오: 하위 클래스와 확장이 많고 생성 방법이 상대적으로 복잡합니다.

팩토리 패턴에는 단순 팩토리, 팩토리 메소드, 추상 팩토리의 세 가지 유형이 있습니다.

세 가지 유형의 팩토리의 차이점은 추상 팩토리에는 여러 제품 라인이 있는 반면, 팩토리 메소드에는 하나의 제품 라인만 있다는 점입니다. 이는 추상 팩토리를 단순화한 것입니다. 팩토리 메소드는 단순 팩토리와 반대되는 개념으로 얼핏 보면 코드를 많이 추가하지만 단순 팩토리와 동일한 기능을 구현하는 것처럼 보인다. 하지만 핵심은 단순 팩토리가 디자인 패턴의 개폐 원리를 엄격하게 따르지 않는다는 것입니다. 새로운 제품을 추가해야 할 경우 팩토리 코드도 수정해야 합니다. 그러나 팩토리 메소드는 열기 및 닫기 원칙을 엄격히 준수합니다. 모드는 추상 팩토리 인터페이스만 담당하며 특정 팩토리는 고객이 확장하도록 남겨둡니다. 분업 과정에서 핵심 엔지니어는 추상 팩토리와 추상 제품의 정의를 담당하고, 비즈니스 엔지니어는 특정 공장과 특정 제품의 구현을 담당합니다. 추상화 계층이 잘 설계되어 있는 한 프레임워크는 매우 안정적입니다.

코드는 다음과 같습니다.

/**
 * 工厂模式
 */
//抽象产品
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 팩토리 패턴이란 무엇인가요? PHP 팩토리 모드를 사용하는 이유는 무엇입니까?

PHP 팩토리 모드의 세 가지 형태의 샘플 코드에 대한 자세한 설명

PHP 팩토리 모드 사용 예 요약

위 내용은 세 가지 PHP 팩토리 모드에 대한 간략한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.