作者:http://blog.csdn.net/fenglibing 轉載請保留
定義:
抽象工廠模式是所有形態的工廠模式中最爲抽象和最具一般性的一種形態,,當有多個抽象角色時,使用的一種工廠模式,它向客戶端提供一個接口,使客戶端在不必指定產品的具體的情況下,創建多個產品族中的產品對象。
注意:
注意產品族的概念:
是指位於不同產品等級結構中,功能相關聯的產品組成的家族。一般是位於不同的等級結構中的相同位置上。顯然,每一個產品族中含有產品的數目,與產品等級結構的數目是相等的,形成一個二維的座標系,水平座標是產品等級結構,縱座標是產品族。叫做相圖。
詳細參考:
http://baike.baidu.com/view/1580269.htm?fr=ala0_1
示例:某人喜歡做什麼
注意看這“某人喜歡”與“做什麼”,這可以理解爲兩個產品族,他們在邏輯上存在一定的關係,但又是絕對的相互獨立,以下我們以“奶奶喜歡種蘋果”、“爺爺喜歡種香蕉”的示例來說明。
示例中有兩個產品族,那我們首先得爲這兩個產品族建立相應的工廠,
某人喜歡
public interface FamilyPerson { public void like(); } |
種什麼(以水果爲例)
public interface Fruit { public void plant(); } |
好了,以上就定義了“某人喜歡”與“種什麼”兩個工廠了,後面再來分別定義他們的實現類,首先定義“某人”的爺爺、奶奶實現類:
爺爺:
public class GrandePa implements FamilyPerson { public void like() { System.out.println("Grandpa likes "); } } |
奶奶:
public class GrandeMa implements FamilyPerson { public void like() { System.out.println("Grandma likes "); } } |
再定義“種什麼”的蘋果、香蕉實現類:
蘋果:
public class Apple implements Fruit { public void plant() { System.out.println("Plant Apple."); } } |
香蕉:
public class Banana implements Fruit { public void plant() { System.out.println("Plant Banana"); } } |
好了,基礎的工廠都有了,現在需要一個抽象工廠了,呵,就是同時引用多個基礎工廠的工廠,定下“愛好”工廠如下:
public interface Hobby { public Fruit getFruit(); public FamilyPerson getFamilyPerson(); } |
實現爺爺喜歡種香蕉:
public class GrandePaHobby implements Hobby { public FamilyPerson getFamilyPerson() { return new GrandePa(); } public Fruit getFruit() { return new Banana(); } } |
實現奶奶喜歡種蘋果:
public class GrandeMaHobby implements Hobby { public FamilyPerson getFamilyPerson() { return new GrandeMa(); } public Fruit getFruit() { return new Apple(); } } |
一切OK,來個調用實例:
public class Test1 { public static void main(String[] args) { Hobby hobby = new GrandeMaHobby(); hobby.getFamilyPerson().like(); hobby.getFruit().plant(); } } |
輸出:
Grandma likes Plant Apple. |