本文章主要是對Java23種設計模式種的工廠模式進行總結。工廠,顧名思義,就是創建批量化操作的大的工廠。而今天我們也可以利用現實生活中的工廠思維,來理解設計模式的工廠模式。
設計模式之工廠模式共有三種形態:
簡單的工廠模式(靜態工廠模式),工廠方法模式(多態性工廠或者虛擬構造子模式)、抽象工廠模式(工具箱模式)
簡單的工廠模式
所謂的簡單工廠模式,所涉及到的有工廠角色、抽象產品角色以及具體產品角色等三個角色
工廠類:擔任角色的是工廠方法模式的核心,含有與應用緊密相關的具體業務邏輯。工廠類在客戶端的直接調用下創建產品對象,它往往是由一個具體的Java類來實現的
抽象產品:是工廠方法模式所創建的對象的父類,或者是他們共同擁有的接口,抽象產品角色可以用一個Java接口或者抽象類來實現
具體產品:工廠方法模式所創建的任何對象都是這個角色的實例,具體產品角色也是由一個Java類實現的。
下面是一個簡單的小栗子,首先工廠是廚房,抽象類是籠統的菜,實現類就是具體哪個菜。
抽象產品
/**
* 抽象類角色:food接口,約束類型
*/
public interface IFood {
/**
* 提供一個展示食物細節的方法
* @param foodName 食物名稱
*/
public void showFood();
}
具體產品-魚、土豆絲
/**
* 具體食物:土豆絲
*/
public class ShreddedPotatoesFood implements IFood{
@Override
public void showFood() {
System.out.println("一盤土豆絲");
}
}
/**
* 具體產品-食物魚
*/
public class FishFood implements IFood
{
@Override
public void showFood() {
System.out.println("一盤魚");
}
}
工廠角色
/**
* 工廠角色-食物工廠
*/
public class SimpleFoodFactory {
/**
* 提供一個靜態方法,用於獲取食物
* @param foodType 食物類型
* @return 具體食物
*/
public static IFood getFood(String foodType){
IFood food = null;
if (foodType.equals("fish")) {
food = new FishFood();
}
if (foodType.equals("potatoes")) {
food = new ShreddedPotatoesFood();
}
return food;
}
}
客戶端
/**
* 客戶端
*/
public class MainTest {
public static void main(String[] args) {
IFood fishfood = SimpleFoodFactory.getFood("fish");
fishfood.showFood();
IFood potatoesfood = SimpleFoodFactory.getFood("potatoes");
potatoesfood.showFood();
}
}
通過分析整個簡單工廠模式,我們不難發現:
該模式的核心在於工廠角色,也就是SimpleFoddFacotry類,這個類包含了必要的判斷邏輯,可以決定什麼時候需要創建什麼對象。而此時的客戶端的操作就只有工廠類的身影。所以,用一句話來概括這一優勢,就是簡單工廠模式實現了對責任的分割。
但同時該方法也存在一定的缺陷,對於擔任工廠角色的工廠類的就顯得尤爲吃力,無論是在維護後期的擴展還是維護。