php面向對象單例模式、工廠模式及6大原則


一.單例模式
目的:為了控制對象的數量(只能夠有一個,相當於類的計划生育)
做法
1.將類的構造函數做成私有的
2.在類里面做了一個公有的函數來造對象
3.將該函數變為靜態的
4.在函數里面加控制

class Ren
{
  public $name;


  static public $dx;                  //靜態成員變量用來存儲該對象
  private function __construct()     //把構造函數設置為私有,類的外部就不能用new造對象了
  { 
  } 

  static function DuiXiang()         //做一個靜態的方法,用來在類的內部造對象
  { 

    if(empty(self::$dx))               //判斷上面定義的變量是否有值,如果沒有,就造一個對象,如果有,就直接輸出這個
    { 
      self::$dx = new Ren();             //因為是靜態變量,只能用類名調用
    }
    return self::$dx;                  

  } }
$r = Ren::DuiXiang(); 

$r->name = "張三";
 $r1 = Ren::DuiXiang();
 $r1->name = "李四";
 var_dump($r);              //由於上面已經造了一個對象$r,所以當再造$r1時,$r1跟$r是一樣的對象

 

 

 

 


二、工廠模式

abstract class YunSuan           //用abstract關鍵字  把類定義為抽象類
{
  public $a;
  public $b;
  //第一個suan函數是普通類
  function Suan()
  {
  }
}


class Jia extends YunSuan
{
  function Suan()
  {
    return $this->a+$this->b;
  }
}

class Jian extends YunSuan
{
  function Suan()
  {
    return $this->a-$this->b;
  }
}

class Cheng extends YunSuan
{
  function Suan()
  {
    return $this->a*$this->b;
  }
}

//做一個工廠類
class GongChang
{
  static function ShengChan($fuhao)        //給它一個變量,隨着變量的不同  函數返回的值就不同
  {
      switch($fuhao)
    {
      case "+":
      return new Jia();
      break;
      
case "-":       return new Jian();       break;
      
case "*":       return new Cheng();       break;     }   } } //算加法 $suan = GongChang::ShengChan("*"); $suan->a = 10; $suan->b = 5; echo $suan->Suan();

 


 

靜態方法可以調靜態變量,但不能調普通變量

普通方法可以調靜態變量,也可以普通變量


 

 

OOP基本上有6大原則,而實際上都是互補的,也就是說一些原則需要利用另一些原則來實現自己。6大原則如下:

1) Open-Close Principle(OCP),開-閉原則,講的是設計要對擴展有好的支持,而對修改要嚴格限制。這是最重要也是最為抽象的原則,基本上我們所說的Reusable Software既是基於此原則而開發的。其他的原則也是對它的實現提供了路徑。

2) Liskov Substituition Principle(LSP),里氏代換原則,很嚴格的原則,規則是“子類必須能夠替換基類,否則不應當設計為其子類。”也就是說,子類只能去擴展基類,而不是隱藏或覆蓋基類。


3) Dependence Inversion Principle(DIP),依賴倒換原則,“設計要依賴於抽象而不是具體化”。換句話說就是設計的時候我們要用抽象來思考,而不是一上來就開始划分我需要哪些哪些類,因為這些是具體。這樣做有什么好處呢?人的思維本身實際上就是很抽象的,我們分析問題的時候不是一下子就考慮到細節,而是很抽象的將整個問題都構思出來,所以面向抽象設計是符合人的思維的。另外這個原則會很好的支持OCP,面向抽象的設計使我們能夠不必太多依賴於實現,這樣擴展就成為了可能,這個原則也是另一篇文章《Design by Contract》的基石。

4) Interface Segregation Principle(ISP),接口隔離原則,“將大的接口打散成多個小接口”,這樣做的好處很明顯,我不知道有沒有必要再繼續描述了,為了節省篇幅,實際上我對這些原則只是做了一個小總結,如果有需要更深入了解的話推薦看《Java與模式》,MS MVP的一:本巨作!^_^

5) 單一職責:一個類的功能盡量單一,降低耦合

6) Law of Demeter or Least Knowlegde Principle(LoD or LKP),迪米特法則或最少知識原則,這個原則首次在Demeter系統中得到正式運用,所以定義為迪米特法則。它講的是“一個對象應當盡可能少的去了解其他對象”。也就是又一個關於如何松耦合(Loosely-Coupled)的法則。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM