設(shè)計(jì)模式

單例模式

單例模式顧名思義,就是只有一個(gè)實(shí)例。作為對(duì)象的創(chuàng)建模式, 單例模式確保某一個(gè)類只有一個(gè)實(shí)例,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例。php的應(yīng)用主要在于數(shù)據(jù)庫(kù)應(yīng)用, 一個(gè)應(yīng)用中會(huì)存在大量的數(shù)據(jù)庫(kù)操作, 在使用面向?qū)ο蟮姆绞介_(kāi)發(fā)時(shí), 如果使用單例模式, 則可以避免大量的new 操作消耗的資源。

/**
 * 設(shè)計(jì)模式之單例模式
 * $_instance必須聲明為靜態(tài)的私有變量
 * 構(gòu)造函數(shù)必須聲明為私有,防止外部程序new類從而失去單例模式的意義
 * getInstance()方法必須設(shè)置為公有的,必須調(diào)用此方法以返回實(shí)例的一個(gè)引用
 * ::操作符只能訪問(wèn)靜態(tài)變量和靜態(tài)函數(shù)
 * new對(duì)象都會(huì)消耗內(nèi)存
 * 使用場(chǎng)景:最常用的地方是數(shù)據(jù)庫(kù)連接。
 * 使用單例模式生成一個(gè)對(duì)象后,該對(duì)象可以被其它眾多對(duì)象所使用。
 */
class one
{
    //保存例實(shí)例在此屬性中
    private static $_instance;

    //構(gòu)造函數(shù)聲明為private,防止直接創(chuàng)建對(duì)象
    private function __construct()
    {
        echo '我被實(shí)例化了!';
    }

    //單例方法
    public static function get_instance()
    {
        var_dump(isset(self::$_instance));
        
        if(!isset(self::$_instance))
        {
            self::$_instance=new self();
        }
        return self::$_instance;
    }

    function test()
    {
        echo("test");
    }
}

// 這個(gè)寫(xiě)法會(huì)出錯(cuò),因?yàn)闃?gòu)造方法被聲明為private
//$test = new one();

// 下面將得到one類的單例對(duì)象
$object = one::get_instance();
$object->test();

單例模式的要點(diǎn)有三個(gè):
1.一是某個(gè)類只能有一個(gè)實(shí)例;
2.二是它必須自行創(chuàng)建這個(gè)實(shí)例;
3.三是它必須自行向整個(gè)系統(tǒng)提供這個(gè)實(shí)例。

工廠模式

抽象基類:類中定義一些抽象方法,用以在子類中實(shí)現(xiàn);
繼承自抽象基類的子類:實(shí)現(xiàn)基類中的抽象方法;
工廠類:用以實(shí)例化所有相對(duì)應(yīng)的子類;


2012070718075239.png
/**
     * 
     * 定義個(gè)抽象的類,讓子類去繼承實(shí)現(xiàn)它
     *
     */
     abstract class Operation{
         //抽象方法不能包含函數(shù)體
         abstract public function getValue($num1,$num2);//強(qiáng)烈要求子類必須實(shí)現(xiàn)該功能函數(shù)
     }
     
     
     
     /**
      * 加法類
      */
     class OperationAdd extends Operation {
         public function getValue($num1,$num2){
             return $num1+$num2;
         }
     }
     /**
      * 減法類
      */
     class OperationSub extends Operation {
         public function getValue($num1,$num2){
             return $num1-$num2;
         }
     }
     /**
      * 乘法類
      */
     class OperationMul extends Operation {
         public function getValue($num1,$num2){
             return $num1*$num2;
         }
     }
     /**
      * 除法類
      */
     class OperationDiv extends Operation {
         public function getValue($num1,$num2){
                 if ($num2==0){
                     echo "除數(shù)不能為0";
                 }else {
                     return $num1/$num2;
                 }
         }
     }

通過(guò)采用面向?qū)ο蟮睦^承特性,我們可以很容易就能對(duì)原有程序進(jìn)行擴(kuò)展,比如:‘乘方’,‘開(kāi)方’,‘對(duì)數(shù)’,‘三角函數(shù)’,‘統(tǒng)計(jì)’等,以還可以避免加載沒(méi)有必要的代碼。
如果我們現(xiàn)在需要增加一個(gè)求余的類,會(huì)非常的簡(jiǎn)單我們只需要另外寫(xiě)一個(gè)類(該類繼承虛擬基類),在類中完成相應(yīng)的功能(比如:求乘方的運(yùn)算),而且大大的降低了耦合度,方便日后的維護(hù)及擴(kuò)展。

現(xiàn)在還有一個(gè)問(wèn)題未解決,就是如何讓程序根據(jù)用戶輸入的操作符實(shí)例化相應(yīng)的對(duì)象呢?
解決辦法:使用一個(gè)單獨(dú)的類來(lái)實(shí)現(xiàn)實(shí)例化的過(guò)程,這個(gè)類就是工廠

/**
     * 工長(zhǎng)類,主要用來(lái)創(chuàng)建對(duì)象
     * 功能:根據(jù)輸入的運(yùn)算符號(hào),工廠就能實(shí)例化出合適的對(duì)象
     *
     */
    class Factory{
        public static function createObj($operate){
            switch ($operate){
                case '+':
                    return new OperationAdd();
                    break;
                case '-':
                    return new OperationSub();
                    break;
                case '*':
                    return new OperationSub();
                    break;
                case '/':
                    return new OperationDiv();
                    break;
            }
        }
    }
    $test=Factory::createObj('/');
    $result=$test->getValue(23,0);
    echo $result;

觀察者模式
命令鏈模式
策略模式
這些相關(guān)設(shè)計(jì)模式下去自行了解,主要把單例模式和工廠模式弄懂;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容