定義:ui
抽象工廠模式是全部形態的工廠模式中最爲抽象和最具通常性的一種形態,,當有多個抽象角色時,使用的一種工廠模式,它向客戶端提供一個接口,使客戶端在沒必要指定產品的具體的狀況下,建立多個產品族中的產品對象。spa
注意:htm
注意產品族的概念:對象
是指位於不一樣產品等級結構中,功能相關聯的產品組成的家族。通常是位於不一樣的等級結構中的相同位置上。顯然,每個產品族中含有產品的數目,與產品等級結構的數目是相等的,造成一個二維的座標系,水平座標是產品等級結構,縱座標是產品族。叫作相圖。接口
詳細參考:get
http://baike.baidu.com/view/1580269.htm?fr=ala0_1產品
示例:某人喜歡作什麼it
注意看這「某人喜歡」與「作什麼」,這能夠理解爲兩個產品族,他們在邏輯上存在必定的關係,但又是絕對的相互獨立,如下咱們以「奶奶喜歡種蘋果」、「爺爺喜歡種香蕉」的示例來講明。class
示例中有兩個產品族,那咱們首先得爲這兩個產品族創建相應的工廠,基礎
某人喜歡
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.