PHP有關的設計模式
阿新 • • 發佈:2018-11-05
一、單例模式
單例模式又稱為職責模式,它用來在程式中建立一個物件,就是例項化出來的物件是唯一的。
基本格式(三私一公-兩靜態):
- 擁有一個private建構函式
- 擁有一個private的儲存靜態例項物件
- 擁有一個private的克隆方法
擁有一個建立這個例項的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);