1. 程式人生 > 其它 >設計模式--工廠模式、生成器模式、單例模式、原型模式

設計模式--工廠模式、生成器模式、單例模式、原型模式

請在學習通學習原型模式,從模式動機、模式定義與分析、模式例項及程式碼要點、模式優缺點及應用場景四個方面分析該模式。

1模式動機:

√複製一個物件,從而克隆出多個與原型物件一模一樣的物件——原型模式

√有些物件的建立過程較為複雜,而且需要頻繁建立

√通過給出一個原型物件來指明所要建立的物件的型別,然後用複製這個原型物件的辦法創建出更多同類型的物件

2模式定義與分析:

2.1模式定義:

√原型模式(Prototype Pattern)∶原型模式一種物件建立型模式,用原型例項指定建立物件的種類,並且通過複製這些原型建立新的物件。

√原型模式允許通過一個原型物件建立一個或個同類型的其他物件,而無須知道任何建立的細節

2.2模式分析:

所有的Java類都繼承自java.lang.Object,而Object類提供一個clone()方法,可以將一個Java物件複製

Java中可以直接使用Object提供的clone()方法來實現物件的克隆(淺克隆)

能夠實現克隆的Java類必須實現一個標識介面Cloneable,表示這個Java類支援複製

如果一個類沒有實現這個介面但是呼叫了clone()方法,Java編譯器將丟擲一個CloneNotSupportedException異常

淺克隆(Shallow Clone) :當原型物件被複制時,只複製它本身和其中包含的值型別的成員變數,而引用型別的成員變數並沒有複製

深克隆(Deep Clone) :除了物件本身被複制外,物件所包含的所有成員變數也將被複制

 

 

 

 

 

3 模式例項及程式碼要點

3.1模式例項:V郵件複製

( 1) 例項說明

由於郵件物件包含的內容較多(如傳送者、接收者、標題、內容、日期、附件等) ,某系統中現需要提供一個郵件複製功能,對於已經建立好的郵件物件,可以通過複製的方式建立一個新的郵件物件,如果需要改變某部分內容,無須修改原始的郵件物件,只需要修改複製後得到的郵件物件即可。使用原型模式設計該系統。在本例項中使用淺克隆實現郵件複製,即複製郵件(Email)的同時不復制附件(Attachment)。

 

 

 

3.2 程式碼

 

Client.java

 

package prototype.shallow;

public class Client
{
    public static void main(String a[])
    {
        Email email,copyEmail;
        email=new Email();
        ropyEmaiI=(Emai1)email.clone();
        System.out.println(" email==copyEmail?");
        System.out.println(email=acopyEmail);     
System.out.println("email.getAttachment==copyEmail.getAttachment?"); System.out.println(email.getAttachment()==copyEmail.getAttachment());   } }

 

 

Email.java

 package prototype.shallow;

public class Email implements Cloneable
{   
private Attachment attachment =null ;   public Email(){    this.attachment=new Att achment();   }   public Object clone()   {     Email clone=null;     try     {      clone=(Email)super.clone();
   }   
catch(CloneNotSupportedException e)     {       System.out.print1n("Clone failure!");     }     return clone;
  }   
public Attachment getAttachment ( )   {
    return this.attachment;
  }
  public void display(){
     System.out.print1n("檢視郵件");
  }
}

 

 

分析:核心要點在 clone=(Email)super.clone();

 

 

4 模式優缺點及應用場景

4.1 原型模式優點

√簡化物件的建立過程,通過複製一個已有例項可以提高新例項的建立效率

擴充套件性較好

簡化建立結構,原型模式中產品的複製是通過封裝在原型類中的克隆方法實現的,無須專門的工廠類來建立產品

可以使用深克隆的方式儲存物件的狀態,以便在需要的時候使用,可輔助實現撤銷操作

4.2 原型模式缺點:

需要為每一個類配備一個克隆方法,而且該克隆方法位於一個類的內部,

對已有的類進行改造時,需要修改原始碼,違背'了開閉原則

在實現深克隆時需要編寫較為複雜的程式碼,而且當物件之間存在多重的巢狀引用時,為了實現深克隆,每層物件對應的類都必須支援深克隆, 實現起來可能會比較麻煩

 

5 應用場景:
1). 建立新物件成本較大,新物件可以通過複製已有物件來獲得,如果是相似物件,則可以對其成員變數稍作修改

2). 系統要儲存物件的狀態,而物件的狀態變化很小

3).需要避免使用分層次的工廠類來建立分層次的物件

 

請將學過的四種設計模式進行關係比較,至少包含兩個要點:

1     每種模式的定義和適用情況

2     至少挑選2個模式,比較他們的異同。


1.  模式定義及適用情況

1.1 工廠模式定義一個用於建立物件的介面,讓介面子類通過工廠方法決定例項化哪一個類。

1)簡單工廠模式:定義了一個建立物件的類,由這個類來封裝例項化物件的行為。  

適用情況包括:工廠類負責建立的物件比較少;客戶端只知道傳入工廠類的引數,對於如何建立物件不關心。
2)工廠方法模式:工廠父類負責定義建立產品物件的公共介面,而工廠子類則負責生成具體的產品物件  

適用情況包括:一個類不知道它所需要的物件的類;一個類通過其子類來指定建立哪個物件;將建立物件的任務委託給多個工廠子類中的某一個,客戶端在使用時可以無須關心是哪一個工廠子類建立產品子類,需要時再動態指定。
3)抽象工廠模式:提供一個建立一系列相關或相互依賴物件的介面,而無須指定它們具體的類。  

適用情況包括:一個系統不應當依賴於產品類例項如何被建立、組合和表達的細節;系統中有多於一個的產品族,而每次只使用其中某一產品族;屬於同一個產品族的產品將在一起使用;

 

1.2 生成器模式(Builder):將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。

生成器模式適用環境:需要生成的產品物件有複雜的內部結構,這些產品物件通常包含多個成員屬性;需要生成的產品物件的屬性相互依賴,需要指定其生成順序;物件的建立過程獨立於建立該物件的類;在生成器模式中引入了指揮者類,將建立過程封裝在指揮者類中,而不在生成器類中;隔離複雜物件的建立和使用,並使得相同的建立過程可以建立不同的產品。

 

1.3 單例模式(Singleton Pattern):單例模式確保某一個類只有一個例項,而且自行例項化並向整個系統提供這個例項,這個類稱為單例類,它提供全域性訪問的方法。單例模式適用情況包括:系統只需要一個例項物件;客戶呼叫類的單個例項只允許使用一個公共訪問點。

1.4 原型模式( Prototype Pattern )

通過給出一個原型物件來指明所要建立的物件的型別,然後用複製這個原型物件的辦法創建出更多同類型的物件。

原型模式是用於建立重複的物件,同時又能保證效能。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。

 

 

原型模式應用場景:

1)當一個系統應該獨立於它的產品建立,構成和表示時。

2)當要例項化的類是在執行時刻指定時,例如,通過動態裝載。

3)為了避免建立一個與產品類層次平行的工廠類層次時。

4)當一個類的例項只能有幾個不同狀態組合中的一種時。建立相應數目的原型並克隆它們可能比每次用合適的狀態手工例項化該類更方便一些。

 

 

2. 生成器模式與抽象工廠模式的異同

√抽象工廠模式與生成器模式功能上相似,它也可以建立複雜物件;
√與抽象工廠模式相比,生成器模式返回一個組裝好的完整產品,而抽象工廠模式返回一系列相關的產品,這些產品位於不同的產品等級結構,構成了一個產品族。生成器模式在最後一步返回產品,而對於抽象工廠模式來說,產品是立即返回的。
√在抽象工廠模式中,客戶端例項化工廠類,然後呼叫工廠方法獲取所需產品物件,而在生成器模式中,客戶端可以不直接呼叫生成器的相關方法,而是通過指揮者類來指導如何生成物件,包括物件的組裝過程和建造步驟,它側重於一步步構造一個複雜物件,返回一個完整的物件。而抽象工廠模式著重於多個系列的產品物件(簡單或複雜的)
√如果將抽象工廠模式看成汽車配件生產工廠,生產一個產品族的產品,那麼生成器模式就是一個汽車組裝工廠,通過對部件的組裝可以返回一輛完整的汽車。