抽象工廠模式解析例子
阿新 • • 發佈:2019-02-13
抽象工廠模式中的有以下的四種角色:
抽象工廠(Abstract Factory)角色:擔任這個角色的是工廠方法模式的核心,它是與應用系統商業邏輯無關的。
具體工廠(Concrete Factory)角色:這個角色直接在客戶端的呼叫下建立產品的例項。這個角色含有選擇合適的產品物件的邏輯,而這個邏輯是與應用系統的商業邏輯緊密相關的。
抽象產品(Abstract Product)角色:擔任這個角色的類是工廠方法模式所建立的物件的父類,或它們共同擁有的介面。
具體產品(Concrete Product)角色:這個角色用以代表具體的產品。
抽象工廠模式就相當於建立例項物件的new,由於經常要根據類生成例項物件,抽象工廠模式也是用來建立例項物件的,所以在需要新的事例物件時便可以考慮是否使用工廠模式。雖然這樣做可能多做一些工作,但會給你係統帶來更大的可擴充套件性和儘量少的修改量。
舉例來說:生產餐具和相應食物的工廠,有兩個車間,其中一個車間用以生產餐具,一個車間用以生產相應的食物。
當消費者消費時,只需要向相應的具體工廠請求具體餐具和具體食物便可以使用餐具消費食物。
使用UML圖表示以上的描述如下:
圖1抽象工廠與具體工廠
圖2抽象餐具與具體餐具(生產車間)
圖3抽象食物與具體食物
每個具體工廠生產出來的具體產品根據不同工廠的不同各不相同,但是客戶使用產品的方法是一致的。比如客戶在得到餐具和食物之後,兩者的搭配是正確的(使用湯匙喝牛奶,使用刀子切面包)。
在本例子中有3個具體工廠AKetchen, BKetchen, BKetchen,分別生產牛奶和湯匙、麵包和刀、肉和叉子。牛奶、麵包和肉都實現了食物介面。湯匙、刀和叉子都實現了餐具介面。
抽象工廠的介面定義如下所示;
package abstractFactory;
public interface KetchenFactory{
public Food getFood();
public TableWare getTableWare();
}
抽象餐具的介面定義如下所示:
package abstractFactory;
public interface TableWare{
public String getTool();
}
抽象事物的介面定義如下所示:
package abstractFactory;
public interface Food{
public String getEatable();
}
而具體的實現也非常簡單,以AKetchen為例子
具體工廠AKetchen的定義如下所示;
package abstractFactory;
public class AKetchen implements KetchenFactory{
public Food getFood(){
return new Milk();
}
public TableWare getTableWare(){
return new Spoon();
}
}
具體餐具(spoon)的定義如下所示:
package abstractFactory;
public class Spoon implements TableWare{
public String getTool() {
return "spoon";
}
}
具體食物(milk)的定義如下所示:
package abstractFactory;
public class Milk implements Food{
public String getEatable(){
return "milk";
}
}
客戶端的定義如下:
package abstractFactory;
public class Client{
public void eat(KetchenFactory k){
System.out.println("A person eat "+k.getFood().getEatable()
+" with "+k.getTableWare().getTool()+"!");
}
public static void main(String[] args){
Client client= new Client();
KetchenFactory kf = new AKetchen();
client.eat(kf);
kf=new BKetchen();
client.eat(kf);
kf= new CKetchen();
client.eat(kf);
}
}
小結:抽象工廠模式特別適合於這樣的一種產品結構:產品分為幾個系列,在每個系列中,產品的佈局都是要同的,在一個系列中某個位置的產品,在另一個系列中一定有一個對應的產品。這樣的產品結構是存在的,這幾個系列中同一位置的產品可能是互斥的,它們是針對不同客戶的解決方案,每個客戶都只擇其一。
優點:消費者任何時候需要某種產品,只需向工廠請求即可。消費者無須修改就可以接納新產品。
缺點:當具體產品修改時,相應的工廠類也要做相應的修改。
如果覺得寫得好,請一定要支援一下,以給我信心和鼓勵把剩下的模式例子寫出來。
本文出自 “凌輝” 部落格,請務必保留此出處http://tianli.blog.51cto.com/190322/32545
抽象工廠(Abstract Factory)角色:擔任這個角色的是工廠方法模式的核心,它是與應用系統商業邏輯無關的。
具體工廠(Concrete Factory)角色:這個角色直接在客戶端的呼叫下建立產品的例項。這個角色含有選擇合適的產品物件的邏輯,而這個邏輯是與應用系統的商業邏輯緊密相關的。
抽象產品(Abstract Product)角色:擔任這個角色的類是工廠方法模式所建立的物件的父類,或它們共同擁有的介面。
具體產品(Concrete Product)角色:這個角色用以代表具體的產品。
抽象工廠模式就相當於建立例項物件的new,由於經常要根據類生成例項物件,抽象工廠模式也是用來建立例項物件的,所以在需要新的事例物件時便可以考慮是否使用工廠模式。雖然這樣做可能多做一些工作,但會給你係統帶來更大的可擴充套件性和儘量少的修改量。
舉例來說:生產餐具和相應食物的工廠,有兩個車間,其中一個車間用以生產餐具,一個車間用以生產相應的食物。
當消費者消費時,只需要向相應的具體工廠請求具體餐具和具體食物便可以使用餐具消費食物。
使用UML圖表示以上的描述如下:
圖1抽象工廠與具體工廠
圖2抽象餐具與具體餐具(生產車間)
圖3抽象食物與具體食物
每個具體工廠生產出來的具體產品根據不同工廠的不同各不相同,但是客戶使用產品的方法是一致的。比如客戶在得到餐具和食物之後,兩者的搭配是正確的(使用湯匙喝牛奶,使用刀子切面包)。
在本例子中有3個具體工廠AKetchen, BKetchen, BKetchen,分別生產牛奶和湯匙、麵包和刀、肉和叉子。牛奶、麵包和肉都實現了食物介面。湯匙、刀和叉子都實現了餐具介面。
抽象工廠的介面定義如下所示;
package abstractFactory;
public interface KetchenFactory{
public Food getFood();
public TableWare getTableWare();
}
抽象餐具的介面定義如下所示:
package abstractFactory;
public interface TableWare{
public String getTool();
}
抽象事物的介面定義如下所示:
package abstractFactory;
public interface Food{
public String getEatable();
}
而具體的實現也非常簡單,以AKetchen為例子
具體工廠AKetchen的定義如下所示;
package abstractFactory;
public class AKetchen implements KetchenFactory{
public Food getFood(){
return new Milk();
}
public TableWare getTableWare(){
return new Spoon();
}
}
具體餐具(spoon)的定義如下所示:
package abstractFactory;
public class Spoon implements TableWare{
public String getTool() {
return "spoon";
}
}
具體食物(milk)的定義如下所示:
package abstractFactory;
public class Milk implements Food{
public String getEatable(){
return "milk";
}
}
客戶端的定義如下:
package abstractFactory;
public class Client{
public void eat(KetchenFactory k){
System.out.println("A person eat "+k.getFood().getEatable()
+" with "+k.getTableWare().getTool()+"!");
}
public static void main(String[] args){
Client client= new Client();
KetchenFactory kf = new AKetchen();
client.eat(kf);
kf=new BKetchen();
client.eat(kf);
kf= new CKetchen();
client.eat(kf);
}
}
小結:抽象工廠模式特別適合於這樣的一種產品結構:產品分為幾個系列,在每個系列中,產品的佈局都是要同的,在一個系列中某個位置的產品,在另一個系列中一定有一個對應的產品。這樣的產品結構是存在的,這幾個系列中同一位置的產品可能是互斥的,它們是針對不同客戶的解決方案,每個客戶都只擇其一。
優點:消費者任何時候需要某種產品,只需向工廠請求即可。消費者無須修改就可以接納新產品。
缺點:當具體產品修改時,相應的工廠類也要做相應的修改。
如果覺得寫得好,請一定要支援一下,以給我信心和鼓勵把剩下的模式例子寫出來。
本文出自 “凌輝” 部落格,請務必保留此出處http://tianli.blog.51cto.com/190322/32545