PHP設計模式總結

Corwien發表於2019-02-16

Learning PHP Design Patterns.設計模式的宗旨就是重用,應用設計模式可以使我們的程式碼更加優雅、簡潔、低耦合。

一、單例模式

1.什麼是單例模式:

一個類最多隻能產生一個物件,如果希望在系統中某個類(連結資料庫的類)的物件只能存在一個,單例模式是最好的解決方案。

2.單利模式的實現:三私一公

①私有化構造方法:防止例項化
②私有化克隆方法:防止克隆
③私有化靜態屬性:儲存物件
④私有化靜態方法:獲取物件

3.程式碼實現

class Singleton{
    private static $obj;//私有化靜態屬性
    private function __construct(){
        //私有化構造方法
    }
    private function __clone(){
        //私有化克隆方法
    }
    //靜態方法產生物件
    static public function getInstance(){
        //物件不存在new一個物件
        if(!is_object(self::$obj)){
            self::$obj = new Singleton();
        }
        return self::$obj;
    }
}

4.測試單例模式

//無法例項化,可以防止new例項化這個類,強制使用getInstance方法,建立物件
$obj1 = new Singleton;
var_dump($obj1);
//成功獲取物件
$obj2 = Singleton::getInstance();
var_dump($obj2);
//無法克隆
$obj3 = clone $obj2;
var_dump($obj3);

二、工廠模式

這也是一個很基本,很簡單,很常用的設計模式。

本來我們要獲取一個類的例項,需要用到new關鍵字。但是如果new 直接寫到業務程式碼裡,一個類在很多地方都例項化過,以後要是這個類出了什麼問題,比如要改個名字(實際中,你更多的可能是修改建構函式方法),那麼就尷尬了,需要改很多地方。

工廠模式,顧名思義,就是不用new來獲得例項,而是把業務類放進一個工場類裡,由工廠(類)『生產』出對應的例項

實現

SimpleFactory.php

<?php
namespace DesignPatternsCreationalSimpleFactory;
class SimpleFactory
{
    public function createBicycle(): Bicycle
    {
        return new Bicycle();
    }
}

Bicycle.php

<?php
namespace DesignPatternsCreationalSimpleFactory;
class Bicycle
{
    public function driveTo(string $destination)
    {
    }
}

使用

$factory = new SimpleFactory();
 $bicycle = $factory->createBicycle();
 $bicycle->driveTo(`Paris`);

我們需要什麼樣的例項,就到工廠的例項方法裡去拿。這裡只定義了一個類的例項,你可以定義更多。

我們看到,業務程式碼裡沒有出現 new以及那個具體的業務類, 這樣 業務類(class Bicycle)我們可以隨便改,以後更新的時候只要在工廠類(class SimpleFactory)裡修改一次,就可以一對多的在各處生效了。

但是,這個方法名字 $factory->createBicycle(); 你得起好,如果你要改這個名字,還是得到多個地方改的。
工廠的作用,簡而言之,就是在工廠裡邊建立業務需要的例項物件,然後,在業務層建立工廠物件呼叫裡邊相關的建立物件方法即可。

總結

  1. 工廠類必須有一個工廠方法;

  2. 工廠方法必須能夠返回一個其他類的例項;

  3. 一次只能建立和返回一個例項;

三、PHP設計模式彙總

PHP設計模式彙總

相關文章:
php設計模式之單例模式
TIGERB的:一個php技術棧後端猿的知識儲備大綱
php 設計模式之工廠模式、單例模式、註冊樹模式

相關文章