簡單工廠模式
不要為了套模式而使用模式。我們的目的是易維護,易擴展。
核心
工廠類,這個類含有判斷邏輯,決定生成用戶需要的子類,并生成相應對象實例返回給用戶使用。
好處
簡單工廠模式的好處是可以將產品對象的細節封裝在其實現類的內部,改變一個產品對象具體實現不會影響其他產品。可擴展性強,當需要新增產品類型時,只需要添加對應的實現類,然后修改工廠,增加一個判斷分支即可。修改工廠函數帶來的風險比較低,我們保留了對子類隨時刪減的權利 ,使用者不需要了解我們有什么子類。而客戶端則可以免除直接創建產品對象的責任,而僅僅負責‘消費’產品。簡單工廠模式通過這種做法實現了對責任的分割。
壞處
當系統中的具體產品類不斷增多時候,可能會出現要求工廠類根據不同條件創建不同實例的需求.這種對條件的判斷和對具體產品類型的判斷交錯在一起,很難避免模塊功能的蔓延,對系統的維護和擴展非常不利;只適用于簡單的業務情況。這樣全部的判斷集中在工廠類中也不好維護。
例子

UML圖
定義接口--抽象產品
public interface Shape
{ void draw();
}
創建實現接口的實體類--具體產品類
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Inside Rectangle::draw() method.");
}
}
public class Square implements Shape {
@Override
public void draw() {
System.out.println("Inside Square::draw() method.");
}
}
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Inside Circle::draw() method.");
}
}
創建一個工廠類--取決于條件的給予,返回不同的實例。
public class ShapeFactory {
//使用 getShape 方法獲取形狀類型的對象
public Shape getShape(String shapeType){
if(shapeType == null)
{ return null; }
if(shapeType.equalsIgnoreCase("CIRCLE"))
{return new Circle(); }
else if(shapeType.equalsIgnoreCase("RECTANGLE"))
{return new Rectangle(); }
else if(shapeType.equalsIgnoreCase("SQUARE"))
{return new Square(); }
return null;
}
}
使用工廠,通過傳遞類型信息來獲取實體類的對象。
public class FactoryPatternDemo {
public static void main(String[] args) {
ShapeFactory shapeFactory = new ShapeFactory();
//獲取 Circle 的對象,并調用它的 draw 方法 這里向上轉型
Shape shape1 = shapeFactory.getShape("CIRCLE");
//調用 Circle 的 draw 方法
shape1.draw();
//獲取 Rectangle 的對象,并調用它的 draw 方法
Shape shape2 = shapeFactory.getShape("RECTANGLE");
//調用 Rectangle 的 draw 方法
shape2.draw();
//獲取 Square 的對象,并調用它的 draw 方法
Shape shape3 = shapeFactory.getShape("SQUARE");
//調用 Square 的 draw 方法 shape3.draw();
}
}
輸出
Inside Circle::draw() method.
Inside Rectangle::draw() method.
Inside Square::draw() method.
例子來源[http://www.runoob.com/design-pattern/factory-pattern.html]