php設計模式講解?單例模式單例模式的含義:,我來為大家科普一下關于php設計模式講解?以下内容希望對你有幫助!
單例模式
單例模式的含義:
作為對象的創建模式,單例模式确保某一個類隻有一個實例,而且自行實例化并向整個系統全局地提供這個實例。它不會創建實例副本,而是會向單例類内部存儲的實例返回一個引用。
單例模式的三個要素:
1. 保存類唯一實例的靜态變量。
2. 構造函數和克隆函數必須是私有的,放在外部去實例化,這樣就不存在單例模式的意義。
3. 提供一個可供外部訪問的公共靜态方法,這個方法返回該類的唯一實例。
單例模式的意義:
在 PHP 中的應用主要在于數據庫應用, 所以一個應用中會存在大量的數據庫操作, 在使用面向對象的方式開發時, 如果使用單例模式, 則可以避免大量的 new 操作消耗的資源。而不完全是對系統資源的節省, 可以避免重複實例化,因為 PHP 每次實例化一個類之後都會清理掉對應的資源,當再次使用的時候又會在重新去實例化一次。
單例模式使用的場景:
1. 數據庫操作,減少對數據路的 new 操作,從而減少内存資源和系統資源的消耗。
2. 配置資源的共享,在一個系統中,配置資源都是全局的,使用單例模式也可以減少每次去讀取配置帶來的内存和系統資源的消耗。
代碼演示:
<?php
class Single
{
public static $attribute = '';
public static $instance = '';
private function __construct($attribute = '個人技術')
{
self::$attribute = $attribute;
}
public static function getInstance($attribute = '我是編程浪子走四方1')
{
if (!(self::$instance instanceof self)) self::$instance = new self($attribute);
return self::$instance;
}
}
單例模式和非單例模式的區别:
class Single {
public function index() {
return '';
}
}
$Single1 = new Single();
$single2 = new Single();
var_dump($single1);
var_dump($single2);
if ($single2 === $single1) {
echo "是同一個對象";
} else {
echo "不是同一個對象";
}
// object(Single)#1 (0) {
// }
// object(Single)#2 (0) {
// }
// 不是同一個對象
class single2 {
// 1.聲明一個靜态屬性,用戶保存類的實例
public static $instance;
//3. 将構函數私有化,避免外部new(每new一次,就不是同一個實例)
private function __construct() {
}
// 2.聲明一個靜态的公共方法,用戶外部調用本類的實例
public static function getInstance() {
if (!(self::$instance instanceof self)) {
self::$instance = new self;
}
return self::$instance;
}
//3. 克隆函數私有化,避免外部clone(每clone一次,就不是同一個實例)
private function __clone() {
}
}
$singleDemo1 = Single2::getInstance();
$singleDemo2 = Single2::getInstance();
var_dump($singleDemo1->getInstance());
var_dump($singleDemo2->getInstance());
if ($singleDemo1 === $singleDemo2) {
echo "是同一個對象";
} else {
echo "不是同一個對象";
}
// object(Single2)#3 (0) {
// }
// object(Single2)#3 (0) {
// }
// 是同一個對象
工廠模式
工廠模式的有含義:
負責生成其他對象的方法。簡單的描述就是通過一個工廠類,去實例化其他類或者方法。
工廠模式的意義:
通過使用工廠模式,減少因為多處 new 同一個類,當這個類發生變法時,則需要多處修改。
代碼演示:
<?php
class Factor
{
public static function createDB()
{
echo '我生産了一個DB實例';
return new DB;
}
}
class DB
{
public function __construct()
{
echo __CLASS__ . PHP_EOL;
}
}
$db = Factor::createDB();
注冊樹模式
注冊數的含義:
注冊樹就是将多個對象注冊在一個對象池中,當我們需要使用時,直接從對象池獲取即可。
注冊數模式的優點:
單例模式解決的是如何在整個項目中創建唯一對象實例的問題,工廠模式解決的是如何不通過 new 建立實例對象的方法。
那麼注冊樹模式想解決什麼問題呢? 在考慮這個問題前,我們還是有必要考慮下前兩種模式目前面臨的局限。
首先,單例模式創建唯一對象的過程本身還有一種判斷,即判斷對象是否存在。存在則返回對象,不存在則創建對象并返回。
每次創建實例對象都要存在這麼一層判斷。
工廠模式更多考慮的是擴展維護的問題。
總的來說,單例模式和工廠模式可以産生更加合理的對象。怎麼方便調用這些對象呢?
而且在項目内如此建立的對象好像散兵遊勇一樣,不便統籌管理安排啊。因 而,注冊樹模式應運而生。
不管你是通過單例模式還是工廠模式還是二者結合生成的對象,都統統給我 “插到” 注冊樹上。我用某個對象的時候,直接從注冊樹上取 一下就好。
這和我們使用全局變量一樣的方便實用。 而且注冊樹模式還為其他模式提供了一種非常好的想法。
代碼演示:
<?php
/**
* 單例模式
*/
class Single
{
public static $attribute = '';
public static $instance = '';
private function __construct($attribute = '個人技術')
{
self::$attribute = $attribute;
}
public static function getInstance($attribute = '個人技術1')
{
if (!(self::$instance instanceof self)) self::$instance = new self($attribute);
return self::$instance;
}
}
/**
* 工廠模式
*/
class Factory
{
public static function createObj()
{
return Single::getInstance('個人技術');
}
}
/**
* 注冊模式
* 含義:就是将對象放在一個對象池中,使用的時候直接去對象池查找.
* 需要如下幾個操作:
* 1.注冊
* 2.存放對象池
* 3.獲取
* 4.銷毀
*/
Class Register
{
// 用一個數組來當做對象池,鍵當做對象别名,值存儲具體對象
public static $objTree = [];
// 将對象放在對象池
public static function set($key, $val)
{
return self::$objTree[$key] = $val;
}
// 通過對象别名在對象池中獲取到對象别名
public static function get($key)
{
return self::$objTree[$key];
}
// 通過對象别名将對象從對象池中注銷
public static function _unset($key)
{
unset(self::$objTree[$key]);
}
}
Register::set('single', Factory::createObj());
$single = Register::get('single');
print_r($single);
echo $single::$attribute;
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!