工廠模式(Factor Pattern)宦焦,就是負責生成其他對象的類或方法发钝,也叫工廠方法模式
實現(xiàn):定義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪一個類波闹。
應(yīng)用場景:眾多子類并且會擴充笼平、創(chuàng)建方法比較復雜。
為什么需要工廠模式
1舔痪,工廠模式可以將對象的生產(chǎn)從直接new 一個對象寓调,改成通過調(diào)用一個工廠方法生產(chǎn)。這樣的封裝锄码,代碼若需修改new的對象時夺英,不需修改多處new語句,只需更改生產(chǎn)對象方法滋捶。
2痛悯,若所需實例化的對象可選擇來自不同的類,可省略if-else多層判斷重窟,給工廠方法傳入對應(yīng)的參數(shù)载萌,利用多態(tài)性,實例化對應(yīng)的類巡扇。
工廠模式分為三種:簡單工廠扭仁、工廠方法、抽象工廠 ,三種工廠的區(qū)別是厅翔,抽象工廠由多條產(chǎn)品線乖坠,而工廠方法只有一條產(chǎn)品線,是抽象工廠的簡化刀闷。而工廠方法和簡單工廠相對熊泵,大家初看起來好像工廠方法增加了許多代碼但是實現(xiàn)的功能和簡單工廠一樣。但本質(zhì)是甸昏,簡單工廠并未嚴格遵循設(shè)計模式的開閉原則顽分,當需要增加新產(chǎn)品時也需要修改工廠代碼。但是工廠方法則嚴格遵守開閉原則施蜜,模式只負責抽象工廠接口卒蘸,具體工廠交給客戶去擴展。在分工時花墩,核心工程師負責抽象工廠和抽象產(chǎn)品的定義悬秉,業(yè)務(wù)工程師負責具體工廠和具體產(chǎn)品的實現(xiàn)。只要抽象層設(shè)計的好冰蘑,框架就是非常穩(wěn)定的和泌。
<?php
/**
* 工廠模式
*
* @author webff
*/
//抽象產(chǎn)品
interface Person {
public function getName();
}
//具體產(chǎn)品實現(xiàn)
class Teacher implements Person {
public function getName() {
return "老師n";
}
}
class Student implements Person {
public 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;
}
}
//簡單工廠調(diào)用
class SimpleClient {
function main() {
// 如果不用工廠模式,則需要提前指定具體類
// $person = new Teacher();
// echo $person->getName();
// $person = new Student();
// echo $person->getName();
// 用工廠模式祠肥,則不需要知道對象由什么類產(chǎn)生武氓,交給工廠去決定
$person = SimpleFactory::getPerson('teacher');
echo $person->getName();
$person = SimpleFactory::getPerson('student');
echo $person->getName();
}
}
//工廠方法
interface CommFactory {
public function getPerson();
}
//具體工廠實現(xiàn)
class StudentFactory implements CommFactory {
public function getPerson(){
return new Student();
}
}
class TeacherFactory implements CommFactory {
public function getPerson() {
return new Teacher();
}
}
//工廠方法調(diào)用
class CommClient {
public 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 '2016級';
}
}
class Grade2 implements Grade {
public function getYear() {
return '2017級';
}
}
//抽象工廠
interface AbstractFactory {
function getPerson();
function getGrade();
}
//具體工廠可以產(chǎn)生每個產(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 {
public function printInfo($factory) {
echo $factory->getGrade()->getYear().$factory->getPerson()->getName();
}
public static 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();