續集工廠模式之工廠(一)
工廠方法模式
我們都知道簡單工廠模式的缺點是擔任工廠角色的工廠類的擴展和維護方面極爲差,爲了能夠解決這一問題,我們需要將工廠類進一步的抽象,於是,這一件的工廠方法模式就有一下幾個角色:
抽象工廠:工廠方法模式的核心,與應用程序無關,任何在模式中創建的對象的工廠必須實現這個接口,
具體工廠:實現抽象工廠接口的具體工廠類,包含了與應用程序的相關設計邏輯,並且受到應用程序調用以創建產品對象。
抽象產品:工廠方法模式所創建的超類型。也就是所有產品對象的父類或者擁有共同特性的接口
具體產品:這個角色實現了抽象產品中角色定義的接口。某個具體的產品有專門的的具體的工廠去負責創建。他們之間是一一對應的。
下面爲一個簡單的小栗子
抽象工廠角色
/**
*
* 角色1:抽象工廠 - 負責獲取食物
*/
public interface MethodFoodFactory {
//獲取食物的方法
public IFishFood getFood();
}
具體工廠:南方食物-魚,北方食物-魚
/**
* 南方口味外賣 - 魚
*/
public class SouthFishFactory implements MethodFoodFactory{
@Override
public IFishFood getFood() {
return new SouthFishFood();
}
}
/**
* 北方口味外賣 - 魚
*/
public class NorthFishFactory implements MethodFoodFactory{
@Override
public IFishFood getFood() {
return new NorthFishFood();
}
}
具體產品:南方食物魚、北方食物魚
/**
* 北方口味 - 魚
*/
public class NorthFishFood implements IFishFood {
@Override
public void showFood() {
System.out.println("來自北方廚師做的魚");
}
}
/**
* 南方口味-魚
*/
public class SouthFishFood implements IFishFood{
@Override
public void showFood() {
System.out.println("來自南方廚師做的魚");
}
}
客戶端調用
/**
* 客戶端
*/
public class MainTest {
public static void main(String[] args) {
//點一個南方口味外賣
MethodFoodFactory southFoodFactory = new SouthFishFactory();
//點一個北方口味外賣
MethodFoodFactory northFoodFactory = new NorthFishFactory();
//拿到南方口味外賣魚
southFoodFactory.getFood().showFood();
//拿到北方口味外賣魚
northFoodFactory.getFood().showFood();
}
}
相比簡單工廠模式,該模式彌補了前者擴展性和維護性的缺點,而且,通過分析整個邏輯,我們可以看到,用戶不必知道具體創建過程,甚至不用知道具體產品的名稱。
但是,從這裏我們不難發現,我們在擴展的時候,每增加一個產品,我們都需要增加一個具體類和對應的工廠,在一定程度上增加系統的複雜度。
抽象工廠模式
我們都知道工廠方法的模式在我們每一次新增一個產品的時候,我們都需要去創建相應的產品以及產品的工廠類。但是,這並不太現實。在我們開發的過程中,不難發現有些的工廠是極其相識的,所以,我們需要對目前狀況進一步的提取共同點,對工廠方法中的抽象工廠角色優化。