1. 程式人生 > >PHP有關的設計模式

PHP有關的設計模式

一、單例模式

單例模式又稱為職責模式,它用來在程式中建立一個物件,就是例項化出來的物件是唯一的。

基本格式(三私一公-兩靜態):

  1. 擁有一個private建構函式
  2. 擁有一個private的儲存靜態例項物件
  3. 擁有一個private的克隆方法
  4. 擁有一個建立這個例項的public的靜態方法,單例類不能再其它類中直接例項化,只能被其自身例項化。

    附上自己手敲的例項

<?php
/**
 * @Author: huang
 * @Date:   2017-09-27 13:45:08
 * @Last Modified by:   huang
 * @Last
Modified time: 2017-09-27 13:54:22 */
class Student { private static $instance = null; private function __construct() { } private function __clone() { } public static function getInstance() { if(is_null(self::$instance) && !(self::$instance instanceof
self)) { self::$instance = new self; } return self::$instance; } } $single = Student::getInstance(); var_dump($single); $single2 = Student::getInstance(); var_dump($single2); // $single3 = clone $single;

補充:
這裡的構造方法宣告為私有是為了禁止在類外通過NEW關鍵字例項化該類。由於getInstance是靜態的方法,那麼裡面不能訪問非靜態的屬性,又不想讓外部訪問該靜態屬性,因此宣告為靜態私有最合適不過。。

二、工廠模式

工廠模式,工廠方法或者類生成物件,而不是在程式碼中直接new

附上相關程式碼:

<?php
/**
 * @Author: huang
 * @Date:   2017-09-27 14:07:20
 * @Last Modified by:   huang
 * @Last Modified time: 2017-09-27 17:21:21
 */

abstract  class Opt{
    abstract function getValue($num1,$num2);
}

class add extends Opt{
    function getValue($num1,$num2)
    {
        echo $num1+$num2.PHP_EOL;
    }
}

class dec extends Opt{

    function getValue($num1,$num2)
    {
        echo $num1-$num2.PHP_EOL;
    }
}

class multi extends Opt{

    function getValue($num1,$num2)
    {
        echo $num1*$num2.PHP_EOL;
    }
}

class chu extends Opt{

    function getValue($num1,$num2)
    {
        if($num2 != 0){
            echo $num1/$num2.PHP_EOL;
        }
    }
}

class Factory{

    public static function make($classname)
    {
        return new $classname;
    }
}

$obj1 = Factory::make('add');
$obj1->getValue(2,1);

$obj1 = Factory::make('dec');
$obj1->getValue(2,1);

$obj1 = Factory::make('multi');
$obj1->getValue(2,1);

$obj1 = Factory::make('chu');
$obj1->getValue(2,1);

三、單例工廠模式(前面二者的混合版)

原理:通過工廠類,一個類只能生產一個物件. 將新物件存入陣列,判斷陣列中是否有該類物件,如果有,則不會再重新建立.所以一個類只能他建立一個物件.

<?php
/**
 * @Author: huang
 * @Date:   2017-09-27 20:44:24
 * @Last Modified by:   huang
 * @Last Modified time: 2017-09-27 20:53:07
 */
class Sigle_Factory{

    private static $arr = array();

    public static function make($classname) {
        if(!isset(self::$arr[$classname])) {
            self::$arr[$classname] = new $classname;
        }
         return self::$arr[$classname];
    }
}

class A{}

class B{}

$obj1 = Sigle_Factory::make('A');
$obj2 = Sigle_Factory::make('A');

$obj3 = Sigle_Factory::make('B');
$obj4 = Sigle_Factory::make('B');

var_dump($obj1,$obj2,$obj3,$obj4);