淺析php原廠模式_PHP

來源:互聯網
上載者:User
關鍵字 php 原廠模式
本系列文章來總結一下設計模式在PHP中的應用,這是第二篇建立型模式之原廠模式。

設計模式的一般介紹在第一篇文章講了,這裡就不重複。

原廠模式

實現:定義一個用於建立對象的介面,讓子類決定執行個體化哪一個類。
應用情境:眾多子類並且會擴充、建立方法比較複雜。

原廠模式分為三種:簡單工廠、Factory 方法、抽象工廠 ,

三種工廠的區別是,抽象工廠由多條產品線,而Factory 方法只有一條產品線,是抽象工廠的簡化。而Factory 方法和簡單工廠相對,大家初看起來好像Factory 方法增加了許多代碼但是實現的功能和簡單工廠一樣。但本質是,簡單工廠並未嚴格遵循設計模式的開閉原則,當需要增加新產品時也需要修改工廠代碼。但是Factory 方法則嚴格遵守開閉原則,模式只負責抽象工廠介面,具體工廠交給客戶去擴充。在分工時,核心工程師負責抽象工廠和抽象產品的定義,業務工程師負責具體工廠和具體產品的實現。只要抽象層設計的好,架構就是非常穩定的。

代碼如下:


/**
* 原廠模式
*/
//抽象產品
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();
}
}
//Factory 方法
interface CommFactory {
public function getPerson();
}
//具體工廠實現
class StudentFactory implements CommFactory {
function getPerson(){
return new Student();
}
}
class TeacherFactory implements CommFactory {
function getPerson() {
return new Teacher();
}
}
//Factory 方法調用
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();
//Factory 方法
//CommClient::main();
//抽象工廠
FactoryClient::main();


小夥伴們瞭解了php設計模式中的原廠模式了吧,是不是挺簡單呢,接下來的文章我們將介紹下建立者模式

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.