面向對象的設計模式---工廠模式和單例模式


1.工廠模式:     

  a.概述:     工廠模式主要是為創建對象提供過渡接口,以便將創建對象的具體過程(new 關鍵字和具體的構造器)隱藏起來。用一個工廠方法來替代,對外提供的只是一個工廠方法,達到提高靈活性的目的。 
     b.優點: 
           1.隱藏了new關鍵字和構造器 
           2.降低了這個對象與別的類之間的耦合度,提高了程序的可擴展性。 
             原因:當子類被別的類替代,或者構造器的參數發生變化的時候,只需改動工廠方法內的new即可,改動量降到了最低,而如果不用工廠模式,而是直接用new關鍵字的話,需要改動的地方就很多了 
           3.把對象的設計和實現分割開來,從而代碼擴展性強、靈活性高。 
     c.工廠模式的使用范圍: 
       當遇到下面的情況時,開發人員可以考慮采用工廠模式: 
       * 在編碼時不能預見需要創建哪一個種類的實例。 
       * 一個類使用它的子類來創建對象。 
       * 開發人員不希望創建了那個類的實例以及如何創建實例的信息暴露給外部程序。 
      除了上面提到的例子,工廠模式的實現方式還允許有一些小小的變化,例如: 
       * 基類可以是一個抽象類,在這種情況下,工廠類必須返回一個非抽象類。 
       * 基類提供了一些缺省方法,只有當這些缺省方法不能滿足特殊需求的情況下才能在子類中重寫這些方法。 
       * 可以直接通過傳遞給工廠類的參數決定應該返回哪一個子類的實例。 
     d. 使用工廠模式,它的設計期於運行期的對象不同,這樣就增強了代碼的可擴展性。 
        它把構造器隱藏了起來,降低了代碼的耦合度,增強了代碼的復用性。 
        工廠模式與new的比較:如果使用new關鍵字的話,那么如果這個類的對象在很多的地方用到,必須要使用多次的new操作,這樣容易引起代碼的重復使用,如果需要改動或者替換成這個類的子類對象,那么,就需要把執行了new操作的所有地方都要改,比較麻煩。而工廠模式,因為它代替了構造器和new關鍵字,而且,它是使用面向接口的,所以,需要這個類的對象的時候,只需要調用這個方法就可以了,如果,需要改動或者替換成這個類的子類對象。只要修改這個工廠里面的內容,而其他的地方都不需要改動。 
          工廠模式的結構是:用一個方法來代替new關鍵字和構造器。 

 

工廠模式相當於創建實例對象的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 = 10;
echo $jia->Suan();
//結果為20

  

 2.  單例模式: 

  
   一、單例模式的四大特征: 
  懶漢式: 
        1。聲明一個私有的,靜態的本類對象,但並不在聲明的時候就初始化,因此,它  的值為null。 
        2。私有化構造器 
        3。對外提供一個全局的,共有的,靜態的,唯一的方法,用來獲得該實例,但注意的是:必須要手動保持線程同步(synchronized) 
        4.在該方法里,判斷對象是否為null,如果是null的話,表示這個類還沒有被實例化,就會初始化這個對象,再返回如果不是null的話,就直接返回。 
  餓漢式: 
        1.聲明一個私有的,靜態的本類對象,並在聲明的時候就初始化 
        2.私有構造器 
        3.對外提供一個全局的,共有的,靜態的,唯一的方法,用來獲得該實例(餓漢式線程本身就是同步的) 
        4.在該方法里,直接返回該對象即可 
    從資源利用效率角度來講,這個比懶漢式單例類稍微差些。從速度和反應時間角度來講,則比懶漢式單例類稍好些。 
    
     二、它能解決什么問題: 
      它確保一個類在java虛擬機里只有一個實例,使一個類只有一個對象,整個系統共享這個對象。 
     三、什么時候使用懶漢式和餓漢式: 
         1。 在使用的幾率很少的情況下使用懶漢式。 --用的時候實例 
         2。 而使用的幾率很高的話就用餓漢式。--一開始就初始化實例 
     四、單例模式的好處: 
         整個系統中的所有的類共用一個實例化對象,這樣可以有效的節省資源。 

 

單例模式的目的是將類只能造一個對象出來

單例模式的主要方法是:將構造 變成私有的-->做一個靜態的生成對象的方法-->造一個靜態的存儲對象-->return 靜態的對象

<?php
class DBDA
{
	//連接數據庫的類讓他只能造一個對象出來,在不加任何控制的時候可以造很多的類出來
    //在造對象的時候會調用構造的方法,
    //把構造方法變成私有的就可以可以控制住
	public static $dx;//存儲對象
	//把構造做為私有
	private function __construct()
	{
			
	}	
	//生成對象
	static function DuiXiang()
	{
		if(empty(self::$dx))
		{
			self::$dx = new DBDA();	//調用靜態對象
		}
		return self::$dx;
	}
}
//DBDA::DuiXiang();//調用靜態方法

$db = DBDA::DuiXiang();

  

面向對象的設計原則:

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個模式,除此之外還有很多其他的一些著名模式,大家可以慢慢研究,如果能自己產出一兩個模式的話那就太好了,證明你也是高手了!^_^


免責聲明!

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



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