PHP 設計模式系列 —— 簡單工廠模式、工廠方法模式、抽象工廠模式
阿新 • • 發佈:2021-01-19
技術標籤:PHP 設計模式
1、簡單工廠模式
定義:定義一個工廠類,他可以根據引數的不同返回不同類的例項,被建立的例項通常都具有共同的父類
在簡單工廠模式中用於被建立例項的方法通常為靜態(static)方法,因此簡單工廠模式又被成為靜態工廠方法
需要什麼,只需要傳入一個正確的引數,就可以獲取所需要的物件,而無需知道其實現過程
缺點:
系統擴充套件困難,一旦新增新產品就不得不修改工廠邏輯,同樣破壞了“開閉原則”;在產品型別較多時,有可能造成工廠邏輯過於複雜,不利於系統的擴充套件和維護。
適用環境:
工廠類負責建立的物件比較少:由於建立的物件較少,不會造成工廠方法中的業務邏輯太過複雜。
呼叫者需要傳入工廠類的引數,對於如何建立物件不關心:呼叫者既不需要關心建立細節,甚至連類名都不需要記住,只需要知道型別所對應的引數。
示例程式碼
1、定義interface,手機有打電話和發簡訊的功能
AbstractMobile.php
<?php
interface AbstractMobile
{
/**
* 打電話
* @return mixed
*/
public function call();
/**
* 發簡訊
* @return mixed
*/
public function send();
}
MobileIPhone.php
<?php
/**
* 蘋果手機
* Class MobileIPhone
*/
require_once __DIR__ . '/AbstractMobile.php';
class MobileIPhone implements AbstractMobile
{
public function call()
{
// TODO: Implement call() method.
echo "IPhone: call" . "<br/>";
}
public function send()
{
// TODO: Implement send() method.
echo "IPhone: send" . "<br/>";
}
}
MobileHuawei.php
<?php
/**
* 華為手機
* Class MobileIPhone
*/
require_once __DIR__ . '/AbstractMobile.php';
class MobileHuawei implements AbstractMobile
{
public function call()
{
// TODO: Implement call() method.
echo "Huawei: call" . "<br/>";
}
public function send()
{
// TODO: Implement send() method.
echo "Huawei: send" . "<br/>";
}
}
MobileXiaomi.php
<?php
/**
* 小米手機
* Class MobileIPhone
*/
require_once __DIR__ . '/AbstractMobile.php';
class MobileXiaomi implements AbstractMobile
{
public function call()
{
// TODO: Implement call() method.
echo "Xiaomi: call" . "<br/>";
}
public function send()
{
// TODO: Implement send() method.
echo "Xiaomi: send" . "<br/>";
}
}
通過工廠類 Factory.php 去呼叫
<?php
/**
* 工廠類
* Class Factory
*/
class Factory
{
private static $instance;
public static function create($name)
{
$class = null;
switch ($name) {
case '1':
require_once __DIR__ . '/MobileIPhone.php';
self::$instance = new MobileIPhone();
break;
case '2':
require_once __DIR__ . '/MobileHuawei.php';
self::$instance = new MobileHuawei();
break;
case '3':
require_once __DIR__ . '/MobileXiaomi.php';
self::$instance = new MobileXiaomi();
break;
default:
echo "類 {$name} 不存在";
exit;
break;
}
return self::$instance;
}
}
例項化工廠類,生成不同的物件,不需要知道手機的實現細節
<?php
// 呼叫工廠
require_once __DIR__ . '/Factoty.php';
ini_set('display_errors', 1);
error_reporting(E_ALL);
// 蘋果手機
$instance = Factory::create('1');
$instance->call();
$instance->send();
echo "<br/>";
// 華為手機
$instance = Factory::create('2');
$instance->call();
$instance->send();
echo "<br/>";
// 小米手機
$instance = Factory::create('3');
$instance->call();
$instance->send();
2、工廠方法模式
定義一個建立物件的介面,讓子類決定哪個類例項化。 他可以解決簡單工廠模式中的封閉開放原則問題。
程式碼示例:
沿用簡單工廠模式中的
AbstractFactory.php
MobileIPhone.php
MobileHuawei.php
MobileXiaomi.php
新增類:
AbstractFactory.php
<?php
/**
* 工廠類
* Class Factory
*/
interface AbstractFactory
{
public function create();
}
FactoryIPhone.php
<?php
require_once __DIR__ . '/AbstractFactory.php';
class FactoryIPhone implements AbstractFactory
{
public function create()
{
// TODO: Implement create() method.
echo "FactoryIPhone: create" . "<br/>";
require_once __DIR__ . '/MobileIPhone.php';
return new MobileIPhone();
}
}
FactoryHuawei.php
<?php
require_once __DIR__ . '/AbstractFactory.php';
class FactoryHuawei implements AbstractFactory
{
public function create()
{
// TODO: Implement create() method.
echo "FactoryHuawei: create" . "<br/>";
require_once __DIR__ . '/MobileHuawei.php';
return new MobileHuawei();
}
}
FactoryXiaomi.php
<?php
require_once __DIR__ . '/AbstractFactory.php';
class FactoryXiaomi implements AbstractFactory
{
public function create()
{
// TODO: Implement create() method.
echo "FactoryXiaomi: create" . "<br/>";
require_once __DIR__ . '/MobileXiaomi.php';
return new MobileXiaomi();
}
}
呼叫:
<?php
// 呼叫工廠
ini_set('display_errors', 1);
error_reporting(E_ALL);
require_once __DIR__ . '/FactoryIPhone.php';
require_once __DIR__ . '/FactoryHuawei.php';
require_once __DIR__ . '/FactoryXiaomi.php';
// 蘋果手機
$factory = new FactoryIPhone();
$instance = $factory->create();
$instance->call();
$instance->send();
echo "<br/>";
// 華為手機
$factory = new FactoryHuawei();
$instance = $factory->create();
$instance->call();
$instance->send();
echo "<br/>";
// 小米手機
$factory = new FactoryXiaomi();
$instance = $factory->create();
$instance->call();
$instance->send();
抽象工廠模式
抽象工廠模式是圍繞一個超級工廠建立其他工廠。該超級工廠又稱為其他工廠的工廠