PHP抽象工廠模式Abstract Factory Pattern優(yōu)點(diǎn)與實(shí)現(xiàn)方式
抽象工廠模式Abstract Factory Pattern是什么
抽象工廠模式是一種創(chuàng)建型模式,它提供了一種創(chuàng)建一系列相關(guān)或相互依賴(lài)對(duì)象的最佳方式。在抽象工廠模式中,我們定義一個(gè)抽象工廠接口,由具體的工廠類(lèi)來(lái)實(shí)現(xiàn)該接口,創(chuàng)建一系列相關(guān)的對(duì)象。
抽象工廠模式的優(yōu)點(diǎn)
- 抽象工廠模式可以幫助我們實(shí)現(xiàn)松耦合,客戶(hù)端代碼無(wú)需知道實(shí)際創(chuàng)建的對(duì)象,只需知道抽象工廠即可;
- 抽象工廠模式可以幫助我們封裝變化,客戶(hù)端代碼無(wú)需關(guān)心具體對(duì)象的創(chuàng)建過(guò)程,只需關(guān)心抽象工廠即可;
- 抽象工廠模式可以幫助我們實(shí)現(xiàn)單一職責(zé)原則,一個(gè)類(lèi)只負(fù)責(zé)一個(gè)職責(zé),由工廠類(lèi)負(fù)責(zé)創(chuàng)建對(duì)象。
抽象工廠模式的實(shí)現(xiàn)
在 PHP 中,我們可以使用以下方式來(lái)實(shí)現(xiàn)抽象工廠模式:
1. 定義抽象產(chǎn)品類(lèi)
<?php
// 定義抽象產(chǎn)品類(lèi)(汽車(chē))
abstract class Car
{
protected $brand;
protected $type;
public function __construct($brand, $type)
{
$this->brand = $brand;
$this->type = $type;
}
abstract public function run();
}
// 定義抽象產(chǎn)品類(lèi)(手機(jī))
abstract class Phone
{
protected $brand;
protected $model;
public function __construct($brand, $model)
{
$this->brand = $brand;
$this->model = $model;
}
abstract public function call();
}2. 定義具體產(chǎn)品類(lèi)
<?php
// 定義具體產(chǎn)品類(lèi)(奔馳汽車(chē))
class BenzCar extends Car
{
public function run()
{
echo "{$this->brand} {$this->type} is running..." . PHP_EOL;
}
}
// 定義具體產(chǎn)品類(lèi)(寶馬汽車(chē))
class BmwCar extends Car
{
public function run()
{
echo "{$this->brand} {$this->type} is running..." . PHP_EOL;
}
}
// 定義具體產(chǎn)品類(lèi)(蘋(píng)果手機(jī))
class ApplePhone extends Phone
{
public function call()
{
echo "{$this->brand} {$this->model} is calling..." . PHP_EOL;
}
}
// 定義具體產(chǎn)品類(lèi)(華為手機(jī))
class HuaweiPhone extends Phone
{
public function call()
{
echo "{$this->brand} {$this->model} is calling..." . PHP_EOL;
}
}3. 定義抽象工廠類(lèi)
<?php
// 定義抽象工廠類(lèi)
abstract class AbstractFactory
{
abstract public function createCar($type);
abstract public function createPhone($model);
}4. 定義具體工廠類(lèi)
<?php
// 定義具體工廠類(lèi)(德國(guó)工廠)
class GermanFactory extends AbstractFactory
{
public function createCar($type)
{
switch ($type) {
case 'Benz':
return new BenzCar('Benz', 'C200L');
case 'Bmw':
return new BmwCar('Bmw', 'X3');
default:
throw new Exception('Undefined car type.');
}
}
public function createPhone($model)
{
switch ($model) {
case 'iPhone':
return new ApplePhone('Apple', 'iPhone 11');
case 'Huawei':
return new HuaweiPhone('Huawei', 'Mate 30');
default:
throw new Exception('Undefined phone model.');
}
}
}
// 定義具體工廠類(lèi)(中國(guó)工廠)
class ChineseFactory extends AbstractFactory
{
public function createCar($type)
{
switch ($type) {
case 'Benz':
return new BenzCar('奔馳', 'C200L');
case 'Bmw':
return new BmwCar('寶馬', 'X3');
default:
throw new Exception('Undefined car type.');
}
}
public function createPhone($model)
{
switch ($model) {
case 'iPhone':
return new ApplePhone('蘋(píng)果', 'iPhone 11');
case 'Huawei':
return new HuaweiPhone('華為', 'Mate 30');
default:
throw new Exception('Undefined phone model.');
}
}
}5. 使用
<?php
// 使用德國(guó)工廠
$germanFactory = new GermanFactory();
$car1 = $germanFactory->createCar('Benz');
$car1->run(); // output: Benz C200L is running...
$phone1 = $germanFactory->createPhone('iPhone');
$phone1->call(); // output: Apple iPhone 11 is calling...
// 使用中國(guó)工廠
$chineseFactory = new ChineseFactory();
$car2 = $chineseFactory->createCar('Bmw');
$car2->run(); // output: 寶馬 X3 is running...
$phone2 = $chineseFactory->createPhone('Huawei');
$phone2->call(); // output: 華為 Mate 30 is calling...總結(jié)
抽象工廠模式是一種非常常見(jiàn)的創(chuàng)建型模式,它可以幫助我們封裝變化,實(shí)現(xiàn)松耦合,同時(shí)遵循單一職責(zé)原則。在實(shí)際開(kāi)發(fā)中,我們可以根據(jù)具體的需求,選擇不同的抽象工廠模式來(lái)實(shí)現(xiàn)一系列相關(guān)對(duì)象的創(chuàng)建。
到此這篇關(guān)于PHP抽象工廠模式Abstract Factory Pattern優(yōu)點(diǎn)與實(shí)現(xiàn)方式的文章就介紹到這了,更多相關(guān)PHP抽象工廠模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
php實(shí)現(xiàn)的返回?cái)?shù)據(jù)格式化類(lèi)實(shí)例
這篇文章主要介紹了php實(shí)現(xiàn)的返回?cái)?shù)據(jù)格式化類(lèi)及其應(yīng)用實(shí)例,包括針對(duì)XML、JSON等的格式化,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-09-09
淺析PHP中的字符串編碼轉(zhuǎn)換(自動(dòng)識(shí)別原編碼)
本篇文章是對(duì)PHP中字符串編碼轉(zhuǎn)換的實(shí)現(xiàn)代碼進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-07-07
PHP 強(qiáng)制性文件下載功能的函數(shù)代碼(任意文件格式)
PHP強(qiáng)制性文件下載函數(shù)代碼,使用此函數(shù)為用戶(hù)提供強(qiáng)制性的文件下載功能。2010-05-05
php實(shí)現(xiàn)表單多按鈕提交action的處理方法
這篇文章主要介紹了php實(shí)現(xiàn)表單多按鈕提交action的處理方法,需要的朋友可以參考下2015-10-10
php簡(jiǎn)單圖像創(chuàng)建入門(mén)實(shí)例
這篇文章主要介紹了php簡(jiǎn)單圖像創(chuàng)建方法,實(shí)例分析了php圖像創(chuàng)建的基本技巧,需要的朋友可以參考下2015-06-06
VIM中設(shè)置php自動(dòng)縮進(jìn)為4個(gè)空格的方法詳解
本篇文章是對(duì)VIM中設(shè)置php自動(dòng)縮進(jìn)為4個(gè)空格的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06

