跟屌絲大哥學(xué)習(xí)設(shè)計模式-抽象工廠模式
1.3 抽象工廠(Abstract Factory)模式
抽象工廠模式可以向客戶端提供一個接口,使得客戶端在不必指定產(chǎn)品具體類型的情況下,創(chuàng)建多個產(chǎn)品族中的產(chǎn)品對象。這就是抽象工廠模式的用意。
每個模式都是針對一定問題的解決方案。抽象工廠模式面對的問題是多產(chǎn)品等級結(jié)構(gòu)的系統(tǒng)設(shè)計。
在學(xué)習(xí)抽象工廠具體實例之前,應(yīng)該明白兩個重要的概念:產(chǎn)品族和產(chǎn)品等級。
產(chǎn)品族:是指位于不同產(chǎn)品等級結(jié)構(gòu)中,功能相關(guān)聯(lián)的產(chǎn)品組成的家族。比如AMD的CPU和ADM芯片的主板,組成一個家族。Intel的CPU和 Intel芯片的主板,又組成一個家族。而這兩個家族都來自于兩個產(chǎn)品等級:CPU,主板。一個等級結(jié)構(gòu)是由相同的結(jié)構(gòu)的產(chǎn)品組成,示意圖如下:
抽象工廠模式可以向客戶端提供一個接口,使得客戶端在不必指定產(chǎn)品具體類型的情況下,創(chuàng)建多個產(chǎn)品族中的產(chǎn)品對象。這就是抽象工廠模式的用意。
每個模式都是針對一定問題的解決方案。抽象工廠模式面對的問題是多產(chǎn)品等級結(jié)構(gòu)的系統(tǒng)設(shè)計。
在學(xué)習(xí)抽象工廠具體實例之前,應(yīng)該明白兩個重要的概念:產(chǎn)品族和產(chǎn)品等級。
產(chǎn)品族:是指位于不同產(chǎn)品等級結(jié)構(gòu)中,功能相關(guān)聯(lián)的產(chǎn)品組成的家族。比如AMD的CPU和ADM芯片的主板,組成一個家族。Intel的CPU和 Intel芯片的主板,又組成一個家族。而這兩個家族都來自于兩個產(chǎn)品等級:CPU,主板。一個等級結(jié)構(gòu)是由相同的結(jié)構(gòu)的產(chǎn)品組成,示意圖如下:

理解這個產(chǎn)品結(jié)構(gòu)是理解抽象工廠模式的關(guān)鍵所在,所以我不惜花費時間來畫此圖。如果領(lǐng)悟不到此圖的含義,就無法區(qū)分工廠方法模式和抽象工廠模式的區(qū)別。
從上圖可以看出,抽象工廠模式的每個工廠創(chuàng)造出來的都是一族產(chǎn)品,而不是一個或者一組。組是可以隨意組合的!其實兩個就這點點差別,呵呵,估計現(xiàn)在你已經(jīng)差不多明白了抽象工廠模式的含義。不廢話了,看個例子,真相將大白于天下!
1.3.1 抽象工廠模式在農(nóng)場中的實現(xiàn)
1.3.1.1 背景
聰明的農(nóng)場主總是讓自己的莊園越來越有價值,“農(nóng)場”在經(jīng)歷了簡單工廠模式和工廠模式后,不斷的擴大生產(chǎn)。如今,再次面臨新的大發(fā)展,一項重要的工作就是 引進塑料大棚技術(shù),在大棚里種植熱帶(Tropical)和亞熱帶(Northern)的水果和蔬菜,用以滿足市場需求,獲取更大的利益。
1.3.1.2 產(chǎn)品角色圖
經(jīng)過分析,對產(chǎn)品角色進行分析得出下圖

經(jīng)過分析,所謂的各個園丁其實就是工廠角色,而蔬菜和水果則是產(chǎn)品角色。將抽象工廠模式用于農(nóng)場中,系統(tǒng)設(shè)計圖如下:


1.3.1.4.1 抽象工廠:Gardener.java
1.3.1.4.7 亞熱帶蔬菜:NorthernVeggie.java
package com.lavasoft.patterns.abstractfactory.ybms;
package com.lavasoft.patterns.abstractfactory.ybms;
/**
* Created by IntelliJ IDEA.
* FileName:Gardener.java
* User: LavaSoft
* Date: 2006-12-5
* Time: 22:55:23
* 《Java與模式》(--閻宏博士著)讀書筆記
* 工廠模式--抽象工廠模式--一般性模式(農(nóng)場應(yīng)用)
* ReadMe: 抽象工廠角色:工廠接口
*/
public interface Gardener {
* Created by IntelliJ IDEA.
* FileName:Gardener.java
* User: LavaSoft
* Date: 2006-12-5
* Time: 22:55:23
* 《Java與模式》(--閻宏博士著)讀書筆記
* 工廠模式--抽象工廠模式--一般性模式(農(nóng)場應(yīng)用)
* ReadMe: 抽象工廠角色:工廠接口
*/
public interface Gardener {
public Fruit createFruit(String name);
1.3.1.4.2 抽象水果產(chǎn)品:Fruit.java
package com.lavasoft.patterns.abstractfactory.ybms;
/**
* Created by IntelliJ IDEA.
* FileName:Fruit.java
* User: LavaSoft
* Date: 2006-12-5
* Time: 22:54:15
* 《Java與模式》(--閻宏博士著)讀書筆記
* 工廠模式--抽象工廠模式--一般性模式(農(nóng)場應(yīng)用)
* ReadMe: 抽象產(chǎn)品角色:水果接口
*/
public interface Fruit {
}
* Created by IntelliJ IDEA.
* FileName:Fruit.java
* User: LavaSoft
* Date: 2006-12-5
* Time: 22:54:15
* 《Java與模式》(--閻宏博士著)讀書筆記
* 工廠模式--抽象工廠模式--一般性模式(農(nóng)場應(yīng)用)
* ReadMe: 抽象產(chǎn)品角色:水果接口
*/
public interface Fruit {
}
1.3.1.4.3 抽象蔬菜產(chǎn)品:Veggie.java
package com.lavasoft.patterns.abstractfactory.ybms;
package com.lavasoft.patterns.abstractfactory.ybms;
/**
* Created by IntelliJ IDEA.
* FileName:Veggie.java
* User: LavaSoft
* Date: 2006-12-5
* Time: 22:56:22
* 《Java與模式》(--閻宏博士著)讀書筆記
* 工廠模式--抽象工廠模式--一般性模式(農(nóng)場應(yīng)用)
* ReadMe: 抽象產(chǎn)品角色:蔬菜接口
*/
public interface Veggie {
}
* Created by IntelliJ IDEA.
* FileName:Veggie.java
* User: LavaSoft
* Date: 2006-12-5
* Time: 22:56:22
* 《Java與模式》(--閻宏博士著)讀書筆記
* 工廠模式--抽象工廠模式--一般性模式(農(nóng)場應(yīng)用)
* ReadMe: 抽象產(chǎn)品角色:蔬菜接口
*/
public interface Veggie {
}
1.3.1.4.4 熱帶水果:TropicalFruit.java
package com.lavasoft.patterns.abstractfactory.ybms;
package com.lavasoft.patterns.abstractfactory.ybms;
/**
* Created by IntelliJ IDEA.
* FileName:TropicalFruit.java
* User: LavaSoft
* Date: 2006-12-5
* Time: 22:57:08
* 《Java與模式》(--閻宏博士著)讀書筆記
* 工廠模式--抽象工廠模式--一般性模式(農(nóng)場應(yīng)用)
* ReadMe: 具體產(chǎn)品角色:熱帶水果
*/
public class TropicalFruit implements Fruit {
private String name;
* Created by IntelliJ IDEA.
* FileName:TropicalFruit.java
* User: LavaSoft
* Date: 2006-12-5
* Time: 22:57:08
* 《Java與模式》(--閻宏博士著)讀書筆記
* 工廠模式--抽象工廠模式--一般性模式(農(nóng)場應(yīng)用)
* ReadMe: 具體產(chǎn)品角色:熱帶水果
*/
public class TropicalFruit implements Fruit {
private String name;
}
1.3.1.4.5 熱帶蔬菜:TropicalVeggie.java
package com.lavasoft.patterns.abstractfactory.ybms;
package com.lavasoft.patterns.abstractfactory.ybms;
/**
* Created by IntelliJ IDEA.
* FileName:TropicalVeggie.java
* User: LavaSoft
* Date: 2006-12-5
* Time: 22:58:03
* 《Java與模式》(--閻宏博士著)讀書筆記
* 工廠模式--抽象工廠模式--一般性模式(農(nóng)場應(yīng)用)
* ReadMe: 具體產(chǎn)品角色:熱帶蔬菜
*/
public class TropicalVeggie implements Veggie {
private String name;
* Created by IntelliJ IDEA.
* FileName:TropicalVeggie.java
* User: LavaSoft
* Date: 2006-12-5
* Time: 22:58:03
* 《Java與模式》(--閻宏博士著)讀書筆記
* 工廠模式--抽象工廠模式--一般性模式(農(nóng)場應(yīng)用)
* ReadMe: 具體產(chǎn)品角色:熱帶蔬菜
*/
public class TropicalVeggie implements Veggie {
private String name;
public TropicalVeggie(String name) {
System.out.println("熱帶工廠為您創(chuàng)建了:熱帶水果-"+name);
}
System.out.println("熱帶工廠為您創(chuàng)建了:熱帶水果-"+name);
}
}
1.3.1.4.6 亞熱帶水果:NorthernFruit.java
package com.lavasoft.patterns.abstractfactory.ybms;
package com.lavasoft.patterns.abstractfactory.ybms;
/**
* Created by IntelliJ IDEA.
* FileName:NorthernFruit.java
* User: LavaSoft
* Date: 2006-12-5
* Time: 22:58:55
* 《Java與模式》(--閻宏博士著)讀書筆記
* 工廠模式--抽象工廠模式--一般性模式(農(nóng)場應(yīng)用)
* ReadMe: 具體產(chǎn)品角色:亞熱帶水果
*/
public class NorthernFruit implements Fruit {
private String name;
* Created by IntelliJ IDEA.
* FileName:NorthernFruit.java
* User: LavaSoft
* Date: 2006-12-5
* Time: 22:58:55
* 《Java與模式》(--閻宏博士著)讀書筆記
* 工廠模式--抽象工廠模式--一般性模式(農(nóng)場應(yīng)用)
* ReadMe: 具體產(chǎn)品角色:亞熱帶水果
*/
public class NorthernFruit implements Fruit {
private String name;
public NorthernFruit(String name) {
System.out.println("亞熱帶工廠為您創(chuàng)建了:亞熱帶水果-"+name);
}
System.out.println("亞熱帶工廠為您創(chuàng)建了:亞熱帶水果-"+name);
}
}
1.3.1.4.7 亞熱帶蔬菜:NorthernVeggie.java
package com.lavasoft.patterns.abstractfactory.ybms;
/**
* Created by IntelliJ IDEA.
* FileName:NorthernVeggie.java
* User: LavaSoft
* Date: 2006-12-5
* Time: 22:59:36
* 《Java與模式》(--閻宏博士著)讀書筆記
* 工廠模式--抽象工廠模式--一般性模式(農(nóng)場應(yīng)用)
* ReadMe: 具體產(chǎn)品角色:亞熱帶蔬菜
*/
public class NorthernVeggie implements Veggie {
private String name;
* Created by IntelliJ IDEA.
* FileName:NorthernVeggie.java
* User: LavaSoft
* Date: 2006-12-5
* Time: 22:59:36
* 《Java與模式》(--閻宏博士著)讀書筆記
* 工廠模式--抽象工廠模式--一般性模式(農(nóng)場應(yīng)用)
* ReadMe: 具體產(chǎn)品角色:亞熱帶蔬菜
*/
public class NorthernVeggie implements Veggie {
private String name;
public NorthernVeggie(String name) {
System.out.println("亞熱帶工廠為您創(chuàng)建了:亞熱帶蔬菜-"+name);
}
System.out.println("亞熱帶工廠為您創(chuàng)建了:亞熱帶蔬菜-"+name);
}
}
1.3.1.4.8 熱帶工廠:TropicalGardener.java
/**
* Created by IntelliJ IDEA.
* FileName:TropicalGardener.java
* User: LavaSoft
* Date: 2006-12-5
* Time: 23:01:49
* 《Java與模式》(--閻宏博士著)讀書筆記
* 工廠模式--抽象工廠模式--一般性模式(農(nóng)場應(yīng)用)
* ReadMe: 具體工廠角色:熱帶工廠
*/
public class TropicalGardener implements Gardener {
public Fruit createFruit(String name) {
return new TropicalFruit(name);
}
/**
* Created by IntelliJ IDEA.
* FileName:TropicalGardener.java
* User: LavaSoft
* Date: 2006-12-5
* Time: 23:01:49
* 《Java與模式》(--閻宏博士著)讀書筆記
* 工廠模式--抽象工廠模式--一般性模式(農(nóng)場應(yīng)用)
* ReadMe: 具體工廠角色:熱帶工廠
*/
public class TropicalGardener implements Gardener {
public Fruit createFruit(String name) {
return new TropicalFruit(name);
}
public Veggie createVeggie(String name) {
return new TropicalVeggie(name);
}
}
return new TropicalVeggie(name);
}
}
1.3.1.4.9 亞熱帶工廠:NorthernGardener.java
package com.lavasoft.patterns.abstractfactory.ybms;
package com.lavasoft.patterns.abstractfactory.ybms;
/**
* Created by IntelliJ IDEA.
* FileName:NorthernGardener.java
* User: LavaSoft
* Date: 2006-12-5
* Time: 23:00:31
* 《Java與模式》(--閻宏博士著)讀書筆記
* 工廠模式--抽象工廠模式--一般性模式(農(nóng)場應(yīng)用)
* ReadMe: 具體工廠角色:亞熱帶工廠
*/
public class NorthernGardener implements Gardener {
public Fruit createFruit(String name) {
return new NorthernFruit(name);
}
* Created by IntelliJ IDEA.
* FileName:NorthernGardener.java
* User: LavaSoft
* Date: 2006-12-5
* Time: 23:00:31
* 《Java與模式》(--閻宏博士著)讀書筆記
* 工廠模式--抽象工廠模式--一般性模式(農(nóng)場應(yīng)用)
* ReadMe: 具體工廠角色:亞熱帶工廠
*/
public class NorthernGardener implements Gardener {
public Fruit createFruit(String name) {
return new NorthernFruit(name);
}
public Veggie createVeggie(String name) {
return new NorthernVeggie(name);
}
}
return new NorthernVeggie(name);
}
}
1.3.1.4.10 測試類(客戶端):TestApp.java
package com.lavasoft.patterns.abstractfactory.ybms;
package com.lavasoft.patterns.abstractfactory.ybms;
/**
* Created by IntelliJ IDEA.
* FileName:TestApp.java
* User: LavaSoft
* Date: 2006-12-5
* Time: 23:03:22
* 《Java與模式》(--閻宏博士著)讀書筆記
* 工廠模式--抽象工廠模式--一般性模式(農(nóng)場應(yīng)用)
* ReadMe: 測試類(客戶端)
*/
public class TestApp {
private void test(){
Veggie tv,nv;
Fruit tf,nf;
TropicalGardener tg=new TropicalGardener();
NorthernGardener ng=new NorthernGardener();
* Created by IntelliJ IDEA.
* FileName:TestApp.java
* User: LavaSoft
* Date: 2006-12-5
* Time: 23:03:22
* 《Java與模式》(--閻宏博士著)讀書筆記
* 工廠模式--抽象工廠模式--一般性模式(農(nóng)場應(yīng)用)
* ReadMe: 測試類(客戶端)
*/
public class TestApp {
private void test(){
Veggie tv,nv;
Fruit tf,nf;
TropicalGardener tg=new TropicalGardener();
NorthernGardener ng=new NorthernGardener();
tv=tg.createVeggie("熱帶菜葉");
nv=ng.createVeggie("東北甜菜");
tf=tg.createFruit("海南椰子");
nf=ng.createFruit("雪梨");
}
public static void main(String args[]){
TestApp test=new TestApp();
test.test();
}
}
nv=ng.createVeggie("東北甜菜");
tf=tg.createFruit("海南椰子");
nf=ng.createFruit("雪梨");
}
public static void main(String args[]){
TestApp test=new TestApp();
test.test();
}
}
1.3.1.4.11 測試運行結(jié)果
熱帶工廠為您創(chuàng)建了:熱帶水果-熱帶菜葉
亞熱帶工廠為您創(chuàng)建了:亞熱帶蔬菜-東北甜菜
熱帶工廠為您創(chuàng)建了:熱帶水果-海南椰子
亞熱帶工廠為您創(chuàng)建了:亞熱帶水果-雪梨
熱帶工廠為您創(chuàng)建了:熱帶水果-熱帶菜葉
亞熱帶工廠為您創(chuàng)建了:亞熱帶蔬菜-東北甜菜
熱帶工廠為您創(chuàng)建了:熱帶水果-海南椰子
亞熱帶工廠為您創(chuàng)建了:亞熱帶水果-雪梨
Process finished with exit code 0
看完設(shè)計圖和源碼,原理已經(jīng)很清楚了,這個模式應(yīng)用很靈活,猴交給你了,看你怎么玩它!哈哈哈哈。。。。
看完設(shè)計圖和源碼,原理已經(jīng)很清楚了,這個模式應(yīng)用很靈活,猴交給你了,看你怎么玩它!哈哈哈哈。。。。
1.3.1.5 女媧舉繩造萬物
女媧舉繩造物的故事很適合在這里舉例子,女媧的繩子按照陰陽劃分,產(chǎn)品則按人、獸劃分。將抽象工廠模式用于女媧造萬物的模擬系統(tǒng)設(shè)計中。系統(tǒng)設(shè)計圖如下:
女媧舉繩造物的故事很適合在這里舉例子,女媧的繩子按照陰陽劃分,產(chǎn)品則按人、獸劃分。將抽象工廠模式用于女媧造萬物的模擬系統(tǒng)設(shè)計中。系統(tǒng)設(shè)計圖如下:

posted on 2012-12-21 16:26 順其自然EVO 閱讀(682) 評論(0) 編輯 收藏 所屬分類: 設(shè)計模式學(xué)習(xí)