抽象工廠模式:
1.模式動機:
在工廠方法模式中具體工廠負責生產具體的產品,每乙個具體工廠對應一種具體產品,工廠方法也具有唯一性,
但有時候我們需要乙個工廠可以提供多個產品物件,而不是單一的產品物件,這時就要用抽象工廠模式。
2.為了能清晰的理解抽象工廠模式,需要先引進兩個概念:
a.產品等級結構:即產品的繼承結構,
如抽象類是電視機,其子類有海爾tv,海信tv,那抽象電視機與具體品牌的電視機之間就構成了乙個產品等級結構。
b.產品族:在抽象工廠模式中,產品族就是由同乙個工廠生產的,位於不同產品等級結構的一組產品,如海爾電器工廠生產的海爾tv,海爾電冰箱。
a.抽象工廠(abstractfactory)
抽象工廠用於宣告生產抽象產品的方法,在乙個抽象工廠中可以定義一組方法,每乙個方法對應乙個產品等級結構
b.具體工廠(concretefactory)
具體工廠實現了抽象 工廠宣告的生產抽象產品的方法,生成一組具體產品,這些產品構成了乙個產品族,每乙個產品都位於某個產品等級結構中
c.抽象產品(abstractproduct)
抽象產品為每種產品宣告介面,在抽象產品中定義了產品的抽象業務方法
d.具體產品(concreteproduct)
具體產品定義具體工廠生產的具體產品物件,實現抽象產品介面中定義的業務方法
***************====分界線********************=
4.具體**實現:
第一步: 寫乙個抽象工廠類 :電器工廠類,用於宣告生成抽象產品的方法;
package abstractfactory;
import abstractproduct.airconditioner;
import abstractproduct.television;
public inte***ce efactory
第二步:具體工廠類。(這裡具體寫了三個類:海爾,海信,tcl)
package concretefactory;
import abstractfactory.efactory;
import abstractproduct.airconditioner;
import abstractproduct.television;
import concreteproduct.haierairconditioner;
import concreteproduct.haiertelevision;
/**
* 海爾工廠類
* 實現了抽象工廠宣告的生成抽象產品的方法
*/ public class haie***ctory implements efactory
public airconditioner produceairconditioner() package concretefactory;
import abstractfactory.efactory;
import abstractproduct.airconditioner;
import abstractproduct.television;
import concreteproduct.hisenseairconditioner;
import concreteproduct.hisensetelevision;
/**
* 海信工廠類
*/ public class hisensefactory implements efactory
public airconditioner produceairconditioner()
package concretefactory;
import abstractfactory.efactory;
import abstractproduct.airconditioner;
import abstractproduct.television;
import concreteproduct.tclairconditioner;
import concreteproduct.tcltelevision;
/**
* 具體工廠類:tcl工廠類
* 實現了抽象工廠宣告的生成抽象產品的方法
*/ public class tclfactory implements efactory
public airconditioner produceairconditioner() 第三步:寫抽象產品類(空調類,電視類)
package abstractproduct;
/**
* 抽象產品類 : 空調類
* 為每種產品宣告介面
* 定義了產品的抽象業務方法
*/ public inte***ce airconditioner
package abstractproduct;
/**
* 抽象產品類 : 電視機類
* 可以是乙個介面,也可以是乙個抽象類
* 為每種產品宣告介面
* 定義了產品的抽象業務方法
*/ public inte***ce television
第四步:具體產品類;
package concreteproduct;
import abstractproduct.airconditioner;
/**
* 具體產品類: 海爾空調類
*/ public class haierairconditioner implements airconditionerpackage concreteproduct;
package concreteproduct;
import abstractproduct.airconditioner;
/**
* 海信空調類
*/ public class hisenseairconditioner implements airconditionerpackage concreteproduct;
package concreteproduct;
import abstractproduct.airconditioner;
/**
* 具體產品類: tcl空調類
*/ public class tclairconditioner implements airconditioner
}package concreteproduct;
第五步:測試類;
import abstractfactory.efactory;
import abstractproduct.airconditioner;
import abstractproduct.television;
import concretefactory.hisensefactory;
/**
* 抽象工廠模型
* @author gong
* */
public class test }
執行結果:
包圖:
5.說明:
在這個例項中,hairtelevision 和 tcltelevision 是television的子類,實現了在television中定義的業務方法play()。
television、hairtelevision和tcltelevision構成了乙個產品等級結構。
hairairconditioner 和 tclairconditioner 是airconditioner 的子類,實現了在airconditioner中定義的業務方法 changetemperature()。
airconditioner、 hairairconditioner 和 tclairconditioner 也構成了乙個產品等級結構。
haie***ctory 和 tclfactory 是 efactory 的乙個子類,實現了在efactory中定義的工廠方法,用於建立具體產品物件。
haie***ctory 和 tclfactory 所生產的具體產品分別構成了乙個產品族。
efactory、haie***ctory 和 tclfactory 構成了乙個工廠等級結構。
6.抽象工廠模式的總結:
優點:
抽象工廠模式隔離了具體類的生成,使得客戶並不需要知道什麼被建立
當乙個產品族中的多個物件被設計成一起工作時,
它能保證客戶端始終只使用同乙個產品族中的物件
增加新的具體工廠和產品族很方便,無須修改已有系統
缺點:
如果要增加一種新品牌的電器,即增加乙個新的產品族,如增加海信電視機和海信空調,則只需要對應增加乙個具體工廠即可
,原有**無須做任何修改。
但如果要增加一種新的產品,如增加一種新的電器產品洗衣機,則原有類需要做較大的修改,在抽象工廠中需要宣告乙個生產洗衣機的方法,
所有的具體工廠類都需要實現該方法。
抽象工廠模式和簡單工廠模式在一定程度上有點相似的地方,兩者都是為了實現高內聚,低耦合的設計思想,它會對我們軟體的設計結構有一些啟發。
抽象工廠模式 抽象工廠模式
抽象工廠模式其實是圍繞了乙個超級工廠建立其他的工廠 可參考工廠模式 這個超級工廠又可以想像成是其他工廠的工廠,這種設計模式是一種建立型模式。在抽象工廠模式中,介面是負責建立乙個相關物件的工廠,不需要顯式指出其類。每個生成的工廠都能按照工廠模式提供物件。意圖提供乙個建立一系列相關或相互依賴物件的介面,...
工廠模式 抽象工廠模式
這裡使用簡單的話來講解工廠模式,不涉及程式設計 什麼是工廠模式呢?我的理解是對抽象介面例項的封裝。假如有乙個介面,有若干的實現類,代表不同的例項。傳統產生物件的方法是直接new乙個出來,對於每個例項都要new,當實現介面的類較多時會很麻煩,並且類的實現也暴露出來了。工廠模式是一種產生物件的模式,使用...
工廠模式 抽象工廠模式
子類父類代換 場景 在不同的條件下,需要建立不同的實現子類時。如網路通訊可以使用tcp udp。可以實現同乙個介面,通過工廠類根據條件 tcp或udp 來例項化不同的子類。這些子類符合黎克特制代換原則。public inte ce tlprotocol public class tcpimpleme...