淺析php工廠模式
本系列文章來(lái)總結(jié)一下設(shè)計(jì)模式在PHP中的應(yīng)用,這是第二篇?jiǎng)?chuàng)建型模式之工廠模式。
設(shè)計(jì)模式的一般介紹在第一篇文章講了,這里就不重復(fù)。
工廠模式
實(shí)現(xiàn):定義一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類(lèi)決定實(shí)例化哪一個(gè)類(lèi)。
應(yīng)用場(chǎng)景:眾多子類(lèi)并且會(huì)擴(kuò)充、創(chuàng)建方法比較復(fù)雜。
工廠模式分為三種:簡(jiǎn)單工廠、工廠方法、抽象工廠 ,
三種工廠的區(qū)別是,抽象工廠由多條產(chǎn)品線,而工廠方法只有一條產(chǎn)品線,是抽象工廠的簡(jiǎn)化。而工廠方法和簡(jiǎn)單工廠相對(duì),大家初看起來(lái)好像工廠方法增加了許多代碼但是實(shí)現(xiàn)的功能和簡(jiǎn)單工廠一樣。但本質(zhì)是,簡(jiǎn)單工廠并未嚴(yán)格遵循設(shè)計(jì)模式的開(kāi)閉原則,當(dāng)需要增加新產(chǎn)品時(shí)也需要修改工廠代碼。但是工廠方法則嚴(yán)格遵守開(kāi)閉原則,模式只負(fù)責(zé)抽象工廠接口,具體工廠交給客戶去擴(kuò)展。在分工時(shí),核心工程師負(fù)責(zé)抽象工廠和抽象產(chǎn)品的定義,業(yè)務(wù)工程師負(fù)責(zé)具體工廠和具體產(chǎn)品的實(shí)現(xiàn)。只要抽象層設(shè)計(jì)的好,框架就是非常穩(wěn)定的。
/**
* 工廠模式
*/
//抽象產(chǎn)品
interface Person {
public function getName();
}
//具體產(chǎn)品實(shí)現(xiàn)
class Teacher implements Person {
function getName() {
return "老師n";
}
}
class Student implements Person {
function getName() {
return "學(xué)生n";
}
}
//簡(jiǎn)單工廠
class SimpleFactory {
public static function getPerson($type) {
$person = null;
if ($type == 'teacher') {
$person = new Teacher();
} elseif ($type == 'student') {
$person = new Student();
}
return $person;
}
}
//簡(jiǎn)單工廠調(diào)用
class SimpleClient {
function main() {
// 如果不用工廠模式,則需要提前指定具體類(lèi)
// $person = new Teacher();
// echo $person->getName();
// $person = new Student();
// echo $person->getName();
// 用工廠模式,則不需要知道對(duì)象由什么類(lèi)產(chǎn)生,交給工廠去決定
$person = SimpleFactory::getPerson('teacher');
echo $person->getName();
$person = SimpleFactory::getPerson('student');
echo $person->getName();
}
}
//工廠方法
interface CommFactory {
public function getPerson();
}
//具體工廠實(shí)現(xiàn)
class StudentFactory implements CommFactory {
function getPerson(){
return new Student();
}
}
class TeacherFactory implements CommFactory {
function getPerson() {
return new Teacher();
}
}
//工廠方法調(diào)用
class CommClient {
static function main() {
$factory = new TeacherFactory();
echo $factory->getPerson()->getName();
$factory = new StudentFactory();
echo $factory->getPerson()->getName();
}
}
//抽象工廠模式另一條產(chǎn)品線
interface Grade {
function getYear();
}
//另一條產(chǎn)品線的具體產(chǎn)品
class Grade1 implements Grade {
public function getYear() {
return '2003級(jí)';
}
}
class Grade2 implements Grade {
public function getYear() {
return '2004級(jí)';
}
}
//抽象工廠
interface AbstractFactory {
function getPerson();
function getGrade();
}
//具體工廠可以產(chǎn)生每個(gè)產(chǎn)品線的產(chǎn)品
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();
}
}
//抽象工廠調(diào)用
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);
}
}
//簡(jiǎn)單工廠
//SimpleClient::main();
//工廠方法
//CommClient::main();
//抽象工廠
FactoryClient::main();
小伙伴們了解了php設(shè)計(jì)模式中的工廠模式了吧,是不是挺簡(jiǎn)單呢,接下來(lái)的文章我們將介紹下創(chuàng)建者模式
- PHP實(shí)現(xiàn)設(shè)計(jì)模式中的抽象工廠模式詳解
- PHP中“簡(jiǎn)單工廠模式”實(shí)例代碼講解
- PHP最常用的2種設(shè)計(jì)模式工廠模式和單例模式介紹
- PHP 工廠模式使用方法
- 初次接觸php抽象工廠模式(Elgg)
- PHP實(shí)現(xiàn)的簡(jiǎn)單三角形、矩形周長(zhǎng)面積計(jì)算器分享
- php實(shí)現(xiàn)天干地支計(jì)算器示例
- 用php簡(jiǎn)單實(shí)現(xiàn)加減乘除計(jì)算器
- php學(xué)習(xí)之簡(jiǎn)單計(jì)算器實(shí)現(xiàn)代碼
- PHP基于工廠模式實(shí)現(xiàn)的計(jì)算器實(shí)例
相關(guān)文章
laravel框架實(shí)現(xiàn)為 Blade 模板引擎添加新文件擴(kuò)展名操作示例
這篇文章主要介紹了laravel框架實(shí)現(xiàn)為 Blade 模板引擎添加新文件擴(kuò)展名操作,結(jié)合實(shí)例形式詳細(xì)分析了laravel框架Blade 模板引擎添加新文件擴(kuò)展名具體操作步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2020-01-01
JieqiCMS 杰奇1.5注冊(cè)機(jī)php源碼
杰奇1.5注冊(cè)機(jī)php源碼,大家可以看下代碼。2009-08-08
laravel model模型定義實(shí)現(xiàn)開(kāi)啟自動(dòng)管理時(shí)間created_at,updated_at
今天小編就為大家整理了一篇laravel model模型定義實(shí)現(xiàn)開(kāi)啟自動(dòng)管理時(shí)間created_at,updated_at,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-10-10
tp5.1框架數(shù)據(jù)庫(kù)子查詢(xún)操作實(shí)例分析
這篇文章主要介紹了tp5.1框架數(shù)據(jù)庫(kù)子查詢(xún)操作,結(jié)合實(shí)例形式分析了tp5.1框架數(shù)據(jù)庫(kù)子查詢(xún)相關(guān)原理、操作實(shí)現(xiàn)方法與注意事項(xiàng),需要的朋友可以參考下2020-05-05
PHP設(shè)計(jì)模式(一)工廠模式Factory實(shí)例詳解【創(chuàng)建型】
這篇文章主要介紹了PHP設(shè)計(jì)模式 工廠模式Factory,結(jié)合實(shí)例形式詳細(xì)分析了工廠模式的基本概念、原理、實(shí)現(xiàn)方法與操作注意事項(xiàng),需要的朋友可以參考下2020-05-05

