說明:該教程全部截選自實驗樓教程 "【16個PHP設計模式詳解】" :主要介紹16個常用的設計模式的基礎概念和技術要點,通過UML類圖幫助理解設計模式中各個類之間的關聯關係,針對每種設計模式都使用PHP完成了一個代碼示例,讓你跟隨實例輕鬆入門設計模式。 一、工廠模式 工廠模式具體可分為三類模式:簡單 ...
說明:該教程全部截選自實驗樓教程【16個PHP設計模式詳解】:主要介紹16個常用的設計模式的基礎概念和技術要點,通過UML類圖幫助理解設計模式中各個類之間的關聯關係,針對每種設計模式都使用PHP完成了一個代碼示例,讓你跟隨實例輕鬆入門設計模式。
一、工廠模式
工廠模式具體可分為三類模式:簡單工廠模式,工廠方法模式,抽象工廠模式;
1.簡單工廠模式
又稱為靜態工廠方法(Static Factory Method)模式,它屬於類創建型模式。在簡單工廠模式中,可以根據參數的不同返回不同類的實例。簡單工廠模式專門定義一個類來負責創建其他類的實例,被創建的實例通常都具有共同的父類。
角色:
- Factory類:負責創建具體產品的實例
- Product類:抽象產品類,定義產品子類的公共介面
- ConcreteProduct 類:具體產品類,實現Product父類的介面功能,也可添加自定義的功能
UML類圖:
示例代碼:
<?php
//簡單工廠模式
class Cat
{
function __construct()
{
echo "I am Cat class <br>";
}
}
class Dog
{
function __construct()
{
echo "I am Dog class <br>";
}
}
class Factory
{
public static function CreateAnimal($name){
if ($name == 'cat') {
return new Cat();
} elseif ($name == 'dog') {
return new Dog();
}
}
}
$cat = Factory::CreateAnimal('cat');
$dog = Factory::CreateAnimal('dog');
簡單工廠模式最大的優點在於實現對象的創建和對象的使用分離,將對象的創建交給專門的工廠類負責,但是其最大的缺點在於工廠類不夠靈活,增加新的具體產品需要修改工廠類的判斷邏輯代碼,而且產品較多時,工廠方法代碼將會非常複雜。
2.工廠方法模式
此模式中,通過定義一個抽象的核心工廠類,並定義創建產品對象的介面,創建具體產品實例的工作延遲到其工廠子類去完成。這樣做的好處是核心類只關註工廠類的介面定義,而具體的產品實例交給具體的工廠子類去創建。當系統需要新增一個產品是,無需修改現有系統代碼,只需要添加一個具體產品類和其對應的工廠子類,是系統的擴展性變得很好,符合面向對象編程的開閉原則;
角色:
- Product:抽象產品類
- ConcreteProduct:具體產品類
- Factory:抽象工廠類
- ConcreteFactory:具體工廠類
UML類圖:
示例代碼:
<?php
interface Animal{
public function run();
public function say();
}
class Cat implements Animal
{
public function run(){
echo "I ran slowly <br>";
}
public function say(){
echo "I am Cat class <br>";
}
}
class Dog implements Animal
{
public function run(){
echo "I'm running fast <br>";
}
public function say(){
echo "I am Dog class <br>";
}
}
abstract class Factory{
abstract static function createAnimal();
}
class CatFactory extends Factory
{
public static function createAnimal()
{
return new Cat();
}
}
class DogFactory extends Factory
{
public static function createAnimal()
{
return new Dog();
}
}
$cat = CatFactory::createAnimal();
$cat->say();
$cat->run();
$dog = DogFactory::createAnimal();
$dog->say();
$dog->run();
工廠方法模式是簡單工廠模式的進一步抽象和推廣。由於使用了面向對象的多態性,工廠方法模式保持了簡單工廠模式的優點,而且剋服了它的缺點。在工廠方法模式中,核心的工廠類不再負責所有產品的創建,而是將具體創建工作交給子類去做。這個核心類僅僅負責給出具體工廠必須實現的介面,而不負責產品類被實例化這種細節,這使得工廠方法模式可以允許系統在不修改工廠角色的情況下引進新產品。
3.抽象工廠模式
提供一個創建一系列相關或相互依賴對象的介面,而無須指定它們具體的類。抽象工廠模式又稱為Kit模式,屬於對象創建型模式。
此模式是對工廠方法模式的進一步擴展。在工廠方法模式中,一個具體的工廠負責生產一類具體的產品,即一對一的關係,但是,如果需要一個具體的工廠生產多種產品對象,那麼就需要用到抽象工廠模式了。
為了便於理解此模式,這裡介紹兩個概念:
- 產品等級結構:產品等級結構即產品的繼承結構,如一個抽象類是電視機,其子類有海爾電視機、海信電視機、TCL電視機,則抽象電視機與具體品牌的電視機之間構成了一個產品等級結構,抽象電視機是父類,而具體品牌的電視機是其子類。
- 產品族 :在抽象工廠模式中,產品族是指由同一個工廠生產的,位於不同產品等級結構中的一組產品,如海爾電器工廠生產的海爾電視機、海爾電冰箱,海爾電視機位於電視機產品等級結構中,海爾電冰箱位於電冰箱產品等級結構中。
角色:
- 抽象工廠(AbstractFactory):擔任這個角色的是抽象工廠模式的核心,是與應用系統的商業邏輯無關的。
- 具體工廠(Factory):這個角色直接在客戶端的調用下創建產品的實例,這個角色含有選擇合適的產品對象的邏輯,而這個邏輯是與應用系統商業邏輯緊密相關的。
- 抽象產品(AbstractProduct):擔任這個角色的類是抽象工廠模式所創建的對象的父類,或它們共同擁有的介面
- 具體產品(Product):抽象工廠模式所創建的任何產品對象都是一個具體的產品類的實例。
UML類圖:
示例代碼:
<?php
interface TV{
public function open();
public function use();
}
class HaierTv implements TV
{
public function open()
{
echo "Open Haier TV <br>";
}
public function use()
{
echo "I'm watching TV <br>";
}
}
interface PC{
public function work();
public function play();
}
class LenovoPc implements PC
{
public function work()
{
echo "I'm working on a Lenovo computer <br>";
}
public function play()
{
echo "Lenovo computers can be used to play games <br>";
}
}
abstract class Factory{
abstract public static function createPc();
abstract public static function createTv();
}
class ProductFactory extends Factory
{
public static function createTV()
{
return new HaierTv();
}
public static function createPc()
{
return new LenovoPc();
}
}
$newTv = ProductFactory::createTV();
$newTv->open();
$newTv->use();
$newPc = ProductFactory::createPc();
$newPc->work();
$newPc->play();
二、建造者模式
又名:生成器模式,是一種對象構建模式。它可以將複雜對象的建造過程抽象出來(抽象類別),使這個抽象過程的不同實現方法可以構造出不同表現(屬性)的對象。
建造者模式是一步一步創建一個複雜的對象,它允許用戶只通過指定複雜對象的類型和內容就可以構建它們,用戶不需要知道內部的具體構建細節。例如,一輛汽車由輪子,發動機以及其他零件組成,對於普通人而言,我們使用的只是一輛完整的車,這時,我們需要加入一個構造者,讓他幫我們把這些組件按序組裝成為一輛完整的車。
角色:
- Builder:抽象構造者類,為創建一個Product對象的各個部件指定抽象介面。
- ConcreteBuilder:具體構造者類,實現Builder的介面以構造和裝配該產品的各個部件。定義並明確它所創建的表示。提供一個檢索產品的介面
- Director:指揮者,構造一個使用Builder介面的對象。
- Product:表示被構造的複雜對象。ConcreateBuilder創建該產品的內部表示並定義它的裝配過程。
包含定義組成部件的類,包括將這些部件裝配成最終產品的介面。
UML類圖:
示例代碼:
<?php
/**
* chouxiang builer
*/
abstract class Builder
{
protected $car;
abstract public function buildPartA();
abstract public function buildPartB();
abstract public function buildPartC();
abstract public function getResult();
}
class CarBuilder extends Builder
{
function __construct()
{
$this->car = new Car();
}
public function buildPartA(){
$this->car->setPartA('發動機');
}
public function buildPartB(){
$this->car->setPartB('輪子');
}
public function buildPartC(){
$this->car->setPartC('其他零件');
}
public function getResult(){
return $this->car;
}
}
class Car
{
protected $partA;
protected $partB;
protected $partC;
public function setPartA($str){
$this->partA = $str;
}
public function setPartB($str){
$this->partB = $str;
}
public function setPartC($str){
$this->partC = $str;
}
public function show()
{
echo "這輛車由:".$this->partA.','.$this->partB.',和'.$this->partC.'組成';
}
}
class Director
{
public $myBuilder;
public function startBuild()
{
$this->myBuilder->buildPartA();
$this->myBuilder->buildPartB();
$this->myBuilder->buildPartC();
return $this->myBuilder->getResult();
}
public function setBuilder(Builder $builder)
{
$this->myBuilder = $builder;
}
}
$carBuilder = new CarBuilder();
$director = new Director();
$director->setBuilder($carBuilder);
$newCar = $director->startBuild();
$newCar->show();
三、單例模式
單例模式,也叫單子模式,是一種常用的軟體設計模式。在應用這個模式時,單例對象的類必須保證只有一個實例存在。許多時候整個系統只需要擁有一個的全局對象,這樣有利於我們協調系統整體的行為。
實現單例模式的思路是:一個類能返回對象一個引用(永遠是同一個)和一個獲得該實例的方法(必須是靜態方法,通常使用getInstance這個名稱);當我們調用這個方法時,如果類持有的引用不為空就返回這個引用,如果類保持的引用為空就創建該類的實例並將實例的引用賦予該類保持的引用;同時我們還將該類的構造函數定義為私有方法,這樣其他處的代碼就無法通過調用該類的構造函數來實例化該類的對象,只有通過該類提供的靜態方法來得到該類的唯一實例。
---維基百科
單例模式的要點有:某個類只能有一個實例;它必須自行創建本身的實例;它必須自行向整個系統提供這個實例。單例模式是一種對象創建型模式。
角色:
- Singleton:單例類
UML 類圖:
示例代碼:
<?php
class Singleton
{
private static $instance;
//私有構造方法,禁止使用new創建對象
private function __construct(){}
public static function getInstance(){
if (!isset(self::$instance)) {
self::$instance = new self;
}
return self::$instance;
}
//將克隆方法設為私有,禁止克隆對象
private function __clone(){}
public function say()
{
echo "這是用單例模式創建對象實例 <br>";
}
public function operation()
{
echo "這裡可以添加其他方法和操作 <br>";
}
}
// $shiyanlou = new Singleton();
$shiyanlou = Singleton::getInstance();
$shiyanlou->say();
$shiyanlou->operation();
$newShiyanlou = Singleton::getInstance();
var_dump($shiyanlou === $newShiyanlou);
上述的五個模式均屬於創建型模式,關於結構型模式,點擊【16個PHP設計模式詳解】即可查看了……