工廠方法模式
定義:
- 定義一個創建產品類實例的工廠接口,而實際類實例的創建由繼承自工廠接口的子類實現。核心工廠類不再負責具體類實例的創建,這樣核心工廠類成爲一個抽象工廠角色,僅負責具體工廠子類必須實現的接口。意義:進一步抽象化的好處是使得工廠方法模式可以使系統在不修改具體工廠角色的情況下引進新的類實例。
角色:
抽象工廠角色
->工廠方法模式的核心,任何工廠類都必須實現這個接口。具體工廠角色
->具體工廠類是抽象工廠的一個實現,負責實例化類實例。抽象角色
->工廠方法模式所創建的所有類實例的父類,它負責描述所有對象所共有的公共接口。- 具體類角色
->工廠方法模式所創建的具體類實例對象。
工廠方法模式和簡單工廠模式比較
1、結構上,工廠方法類的核心是一個抽象工廠類,而簡單工廠模式把核心放在一個具體類上。
2、工廠方法模式之還叫多態性工廠模式,原因是具體工廠類都有共同的接口,或者有共同的抽象父類。
3、當系統擴展需要添加新的類實例對象時,僅僅需要添加一個具體對
象,並實現一個具體工廠對象,原有工廠對象不需要進行任何修改,很好的符合了“開放-封閉”原則。而簡單工廠模式在添加新產品對象後不得不修改工廠方法,擴展性不好。
代碼講解
以上一章節介紹的例子講解。
抽象工廠角色
public interface FruitFactory {
public Fruit getFruit();
}
具體工廠角色
因爲有兩種水果apple和banana,所有需要兩個具體工廠,用於創建該兩種水果。
分爲爲:
public class AppleFactory implements FruitFactory {
public Fruit getFruit() {
return new Apple();
}
}
public class BananaFactory implements FruitFactory {
public Fruit getFruit() {
return new Banana();
}
}
抽象角色
public interface Fruit {
public void get();
}
具體類角色
public class Apple implements Fruit{
public void get(){
System.out.println("Apple");
}
}
public class Banana implements Fruit{
public void get(){
System.out.println("Banana");
}
}
到目前爲止,還有最後一個問題,就是當添加新類的時候,該如何擴展?假如,我們再添加一個水果Pear。
按照上面的講解,應該首先添加一個Pear的具體工廠類,如下:
public class PearFactory implements FruitFactory {
public Fruit getFruit() {
return new Pear();
}
}
具體類角色,如下:
public class Pear implements Fruit {
public void get() {
System.out.println("Pear");
}
}
是不是,很簡單就實現了新類的擴展。
那麼,該如何調用呢,請看:
public class MainClass {
public static void main(String[] args) {
//獲得AppleFactory
FruitFactory af = new AppleFactory();
Fruit apple = af.getFruit();
apple.get();
//獲得BananaFactory
FruitFactory bf = new BananaFactory();
Fruit banana = bf.getFruit();
banana.get();
//獲得PearFactory
FruitFactory pf = new PearFactory();
Fruit pear = pf.getFruit();
pear.get();
}
}