簡單工廠模式的動機
簡單工廠模式主要應用在簡歷大量功能相似的類時。比如在界面上,按鈕需要具有相同的畫風、外觀等等,但是具體的功能不一樣。也就是類型相似,但是功能不同(也就是通常擁有相同的父類)。如果使用普通的new對象來創建,將會出現大量的new對象。通常使用一個工廠類來進行創建具體的類。
模式定義
簡單工廠模式(Simple Factory Pattern):又稱爲靜態工廠方法(Static Factory Method)模式,它屬於類創建型模式。在簡單工廠模式中,可以根據參數的不同返回不同類的實例。簡單工廠模式專門定義一個類來負責創建其他類的實例,被創建的實例通常都具有共同的父類
模式的結構
簡單工廠的角色
代碼分析
Shape.java
public interface Shape {
void draw();
}
Circle.Java
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("i am a circle");
}
}
Square.java
public class Square implements Shape {
@Override
public void draw() {
System.out.println("I am a Square");
}
}
ShapeFactory.java
public class ShapeFactory {
public static Shape create(String shapeType){
if (shapeType == "square"){
return new Square();
} else{
return new Circle();
}
}
public static void main(String[] args) {
Shape shape = ShapeFactory.create("square");
shape.draw();
}
}
簡單工廠模式的意義
- 簡單工廠模式的本質仍然是根據傳入的值創建對象,通過不斷的if或者else if來判斷需要創建的對象
- 簡單工廠模式最大的問題在於工廠類的職責相對過重,增加新的產品需要修改工廠類的判斷邏輯,這一點與開閉原則是相違背的。
- 簡單工廠模式的要點在於:當你需要什麼,只需要傳入一個正確的參數,就可以獲取你所需要的對象,而無須知道其創建細節。
- 簡單工廠將同一接口下的類進行統一創建,將創建與使用進行解耦,降低了組件之間的依賴性,對象的業務不依賴於他的對象而是依賴於工廠和統一的接口,工廠基於不同的對象進行調度,如果需要返回別的對象,可以只需要修改工廠類,而不需要找到所有的業務實現中的調用,使對象的創建更加靈活
簡單工廠的使用情景
- 首先因爲簡單工廠需要不停的進行判斷,所以如果需要創建的類太多,工廠方法就會進行復雜的邏輯判斷或者長時間的進行匹配,程序運行效率較低
- 需要對調用方隱藏創建方式
JDK中的應用實例
-
dateformat中使用了工廠方式進行創建
Dateformat
private static DateFormat get(int timeStyle, int dateStyle,
int flags, Locale loc) {
if ((flags & 1) != 0) {
if (timeStyle < 0 || timeStyle > 3) {
throw new IllegalArgumentException("Illegal time style " + timeStyle);
}
} else {
timeStyle = -1;
}
if ((flags & 2) != 0) {
if (dateStyle < 0 || dateStyle > 3) {
throw new IllegalArgumentException("Illegal date style " + dateStyle);
}
} else {
dateStyle = -1;
}
LocaleProviderAdapter adapter = LocaleProviderAdapter.getAdapter(DateFormatProvider.class, loc);
DateFormat dateFormat = get(adapter, timeStyle, dateStyle, loc);
if (dateFormat == null) {
dateFormat = get(LocaleProviderAdapter.forJRE(), timeStyle, dateStyle, loc);
}
return dateFormat;
}