首頁  >  文章  >  後端開發  >  php 設計模式:單例模式與工廠模式詳解

php 設計模式:單例模式與工廠模式詳解

怪我咯
怪我咯原創
2017-07-12 14:09:491292瀏覽

1.單例模式

單例模式是常用的軟體設計模式。在它的核心結構中只包含一個被稱為單例類別的特殊類別。透過單例模式可以確保系統中一個類別只有一個實例而且該實例易於外界訪問,從而方便對實例個數的控制並節約系統資源。如果希望在系統中某個類別的物件只能存在一個,單例模式是最好的解決方案。

優點

一、實例控制

單例模式會阻止其他物件實例化自己的單例物件的副本,從而確保所有物件都存取唯一實例。

二、靈活性

因為類別控制了實例化過程,所以類別可以靈活地更改實例化過程。

本文主要介紹了PHP中單例模式工廠模式的相關知識。具有很好的參考價值,以下跟著小編一起來看下吧

php中使用單例模式的原因

我用php大部分操作都是和各種資料庫打交道,包括mysql,redis,memcache等各種關係型和非關係型資料庫,所以一個應用中會存在大量連接資料庫的操作,如果不用單例模式,那每次都要new操作,但是每次new都會消耗大量的內存資源和系統資源,而且每次打開和關閉數據庫連接都是對數據庫的一種極大考驗和浪費。

需要一個保存類別的唯一實例的靜態成員變數(通常$instance為私有變數)

建構子和複製函式必須宣告為私有的,為了防止外部程式new類別從而失去單例模式意義

必須提供一個存取這個實例的公共靜態方法,從而傳回唯一實例的一個引用

//设计模式
//单例模式 都是使用同一个对象
//class Ren
//{
// public $name;
// private static $dx; //存储对象
//
// private function construct()
// {
//
// }
//
// public static function DuiXiang()
// {
//  if(empty(self::$dx))
//  {
//   self:;$dx=new Ren();
//  }
//  return self::$dx;
// }
//}
//
//$r= Ren::DuiXiang();
//把构造函数变为私有
//做了一个方法来间接造对象
//在该方法里面加限制

2.工廠模式

工廠模式就是專門負責將大量有共同介面(或共同抽象父類別)的類別實例化,而且不必事先知道每次是要實例化哪一個類別的模式。它定義一個用於創建物件的接口,由子類別決定實例化哪一個類別。

優點
工廠類別是整個模式​​的關鍵.包含了必要的邏輯判斷,根據外界給定的資訊,決定究竟應該創建哪個具體類別的物件.透過使用工廠類別,外界可以從直接創建具體產品對象的尷尬局面擺脫出來,僅僅需要負責“消費”對象就可以了。而不必管這些物件究竟如何創建及如何組織的.明確了各自的職責和權利,有利於整個軟體體系結構的最佳化。
缺點
由於工廠類別集中了所有實例的創建邏輯,違反了高內聚責任分配原則,將全部創建邏輯集中到了一個工廠類別中;它所能創建的類別只能是事先考慮到的,如果需要添加新的類,則需要改變工廠類了。
當系統中的特定產品類別不斷增加時候,可能會出現要求工廠類別根據不同條件建立不同實例的需求.這種對條件的判斷和對具體產品類型的判斷交錯在一起,很難避免模組功能的蔓延,對系統的維護和擴展非常不利;
這些缺點在工廠方法模式中得到了一定的克服。
使用場景
工廠類別負責創建的物件比較少;
客戶只知道傳入工廠類別的參數,對於如何創建物件(邏輯)不關心;
由於簡單工廠很容易違反高內聚責任分配原則,因此一般只在很簡單的情況下應用。

通常,工廠模式有一個關鍵的構造,根據一般原則命名為Factory的靜態方法,然而這只是一種原則,工廠方法可以任意命名,這個靜態還可以接受任意資料的參數,必須傳回一個物件。

class YunSuan
{
 public $a;
 public $b;
 function Suan()
 {
  echo "对两个数进行运算";
 }
class gongchang
{ //功能 : 给一个参数,返回一个对象
 static function chanpin($name)
 {
  switch($name)
  {
   case "'+":
    return new jia();
    break;
   case "-";
    return new jian();
    break;
  }
 }
}
$a=gongchang::chanpin("+");

以上是php 設計模式:單例模式與工廠模式詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn