java設計模式學習筆記--抽象工廠模式
1. 什麼是抽象工廠模式
抽象工廠模式提供一個介面,用於建立相關或依賴物件的家族,而不需要明確指定具體類。
也就是說抽象工廠模式是用來 建立產品的家族的。
為了理解這個定義,我們先要搞清楚什麼是產品的家族。
那麼什麼是產品的家族哪,我的理解就是一群相關的產品的集合。那披薩來說,披薩的麵餅,作料,醬汁等這些組合在一起,那麼就成為了產品族。
好了等理解了產品家族這個概念,現在來看一下具體的抽象工廠的結構吧。
2. 抽象工廠模式的結構
從類圖中我們可以看到,抽象工廠提供了一個Creater介面,用來建立一個產品家族。而Creater的每個具體的子類(ConcreateCreate1等)都建立一個家族的產品,在這些子類中的方法則用來負責在抽象工廠中建立具體的產品(ProductA等)(通常是以”工廠方法來實現的”)。
下面請看示例程式碼:
Creator:
public interface ComputerFactory {
Cpu createCpu();
Board cerateBoard();
}
ConcreteCrator:
public class IntelComputer implements ComputerFactory{
@Override
public Cpu createCpu() {
return new IntelCpu();
}
@Override
public Board cerateBoard () {
return new IntelBoard();
}
}
public class AmdComputer implements ComputerFactory{
@Override
public Cpu createCpu() {
return new AmdCpu();
}
@Override
public Board cerateBoard() {
return new AmdBoard();
}
}
Product:
public interface Cpu {
void model();
}
public interface Board {
void model();
}
ConcreteProduct:
Intel的產品家族:
public class IntelCpu implements Cpu {
@Override
public void model() {
System.out.println("this is IntelCpu");
}
}
public class IntelBoard implements Board {
@Override
public void model() {
System.out.println("this is IntelBoard");
}
}
amd的產品家族:
public class AmdCpu implements Cpu{
@Override
public void model() {
System.out.println("this is AmdCpu");
}
}
public class AmdBoard implements Board {
@Override
public void model() {
System.out.println("this is AmdBoard");
}
}
測試類:
public class Client {
public static void main(String[] args){
ComputerFactory cf = new IntelComputer();
Cpu cpu = cf.createCpu();
Board board = cf.cerateBoard();
cpu.model();
board.model();
cf = new AmdComputer();
cpu = cf.createCpu();
board = cf.cerateBoard();
cpu.model();
board.model();
}
}
輸出結果:
在上面的程式碼中,Cpu和Board組合在一起就成為了一個產品家族,由抽象工廠來建立。
而具體的Cpu或者Board則可以使用工廠方法來建立(這裡不做演示)。
3、抽象工廠模式和工廠方法模式比較
工廠方法模式:整個工廠方法模式,只不過是通過子類來建立物件,用這種方法,客戶只需要知道他們所使用的抽象型別就可以了,而由子類來負責決定具體的型別,所以這樣就將客戶從具體型別中解耦了。
抽象工廠模式:提供一個用來建立一個產品家族的抽象型別,這個型別的子類定義了產品被產生的方法。在抽象工廠中,經常使用 工廠方法來實現具體的工廠
4、對所有工廠模式的總結
1、所有工廠都是用來封裝物件的建立。
2、工廠方法使用繼承:把物件的建立委託給子類,子類實現工廠方法來建立物件。
3、抽象工廠使用物件的組合:物件的建立在工廠介面所暴露的方法中實現。
4、所有的工廠模式都通過減少應用程式和具體類之間的依賴促進鬆耦合,使設計更具有彈性。