優才公開課筆記:php設計模式 (二)之工廠模式

最近開展了三次設計模式的公開課,如今來總結一下設計模式在PHP中的應用,這是第二篇建立型模式之工廠模式。設計模式

設計模式的通常介紹在第一篇文章講了,這裏就不重複。框架

工廠模式
實現:定義一個用於建立對象的接口,讓子類決定實例化哪個類。
應用場景:衆多子類而且會擴充、建立方法比較複雜。設計

工廠模式分爲三種:簡單工廠、工廠方法、抽象工廠 ,三種工廠的區別是,抽象工廠由多條產品線,而工廠方法只有一條產品線,是抽象工廠的簡化。而工廠方法和簡單工廠相對,你們初看起來好像工廠方法增長了許多代碼可是實現的功能和簡單工廠同樣。但本質是,簡單工廠並未嚴格遵循設計模式的開閉原則,當須要增長新產品時也須要修改工廠代碼。可是工廠方法則嚴格遵照開閉原則,模式只負責抽象工廠接口,具體工廠交給客戶去擴展。在分工時,核心工程師負責抽象工廠和抽象產品的定義,業務工程師負責具體工廠和具體產品的實現。只要抽象層設計的好,框架就是很是穩定的。code

/**
 * 優才網公開課示例代碼
 *
 * 工廠模式
 *
 * @author 優才網全棧工程師教研組
 * @see http://www.ucai.cn
 */

//抽象產品
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();

想了解更多,來聽公開課吧:http://www.ucai.cn/train?f=17對象

相關文章
相關標籤/搜索