工廠模式:
工廠模式就是專門負責將大量有共同接口的類實例化,而且不必事先知道每次是要實例化哪一個類的模式。它定義一個用于創建對象的接口,由子類決定實例化哪一個類。
工廠模式相當于創建實例對象的new,經常要根據類Class生成實例對象,如A a=new A() 工廠模式也是用來創建實例對象的,工廠模式是現今最常用的模式,在Java程序系統中隨處可見。
<?php class YunSuan {public $a;public $b; //寫空的操作方法public function Suan(){ } } //面向操作的繼承之前學過(可擴展性比較高) class Jia extends YunSuan {public function Suan(){return $this->a+$this->b; } }//工廠模式: //工廠類:生產對象 class GongChang {//不需要造對象直接就可以調用static function ShengChan($ysf){switch($ysf){case "+":return new Jia();break;case "-":return new Jian();break; }} }$jia = GongChang::ShengChan("+"); $jia->a = 10; $jia->b = 19; var_dump($jia); echo $jia->Suan();
使用工廠模式的好處是:使用類的人不必知道做的是什么類,只需要知道工廠類,然后賦予相應的參數,會自動造出相應的對象,然后調用相應的方法即可。為防止類里面有很多參數容易記混可以使用工廠模式,傳入易懂得參數調用相應的方法
?
單例模式:
單例模式是一種常用的軟件設計模式。在它的核心結構中只包含一個被稱為單例類的特殊類。通過單例模式可以保證系統中一個類只有一個實例而且該實例易于外界訪問,從而方便
對實例個數的控制并節約系統資源。如果希望在系統中某個類的對象只能存在一個,單例模式是最好的解決方案。顯然單例模式的要點有三個:一是某個類只能有一個實例;二是它
必須自行創建這個實例;三是它必須自行向整個系統提供這個實例。
我們的類在造對象的時候只允許用戶造一個對象,多了不可以。像之前的數據訪問類DBDA,每次在使用的時候都需要new
特別注意以下的注釋部分:
??
<?php class DBDA {//連接數據庫的類讓他只能造一個對象出來,在不加任何控制的時候可以造很多的類出來//在造對象的時候會調用構造的方法,//把構造方法變成私有的就可以可以控制住public static $dx;//用來存儲對象//把構造做為私有的private function __construct(){} //生成對象的方法//為了使該方法能夠較簡單的被調用因此做成靜態的static function DuiXiang(){//因為存儲的對象$dx是靜態的因此使用selfif(empty(self::$dx)){self::$dx = new DBDA();}return self::$dx;}}//可以控制住不讓他隨便new但是又有新的問題就是現在一個對象都造不出來了 //$db = new DBDA();//下面是不會報錯的,單例模式 $db = DBDA::DuiXiang();
單例模式的目的是將類只能造一個對象出來
單例模式的主要方法是:將構造 變成私有的-->做一個靜態的生成對象的方法-->造一個靜態的存儲對象-->return 靜態的對象
面向對象設計的原則
OOD基本上有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)的法則。
好了,以上是6大原則(或法則)的介紹,對這些原則的深入研究正是如何得到設計模式的道路。在進行了深入了解后我們就可以開始看看設計模式了,設計模式正是對這些法則的應用,著名的設計模式有四人幫(Gang of Four,GoF)的23個模式,除此之外還有很多其他的一些著名模式,大家可以慢慢研究,如果能自己產出一兩個模式的話那就太好了,證明你也是高手了!^_^