簡單工廠模式
不要為了套模式而使用模式掷空。我們的目的是易維護,易擴展囤锉。
核心
工廠類坦弟,這個類含有判斷邏輯,決定生成用戶需要的子類官地,并生成相應(yīng)對象實例返回給用戶使用酿傍。
好處
簡單工廠模式的好處是可以將產(chǎn)品對象的細節(jié)封裝在其實現(xiàn)類的內(nèi)部,改變一個產(chǎn)品對象具體實現(xiàn)不會影響其他產(chǎn)品驱入〕喑矗可擴展性強,當(dāng)需要新增產(chǎn)品類型時亏较,只需要添加對應(yīng)的實現(xiàn)類莺褒,然后修改工廠,增加一個判斷分支即可雪情。修改工廠函數(shù)帶來的風(fēng)險比較低遵岩,我們保留了對子類隨時刪減的權(quán)利 ,使用者不需要了解我們有什么子類巡通。而客戶端則可以免除直接創(chuàng)建產(chǎn)品對象的責(zé)任尘执,而僅僅負責(zé)‘消費’產(chǎn)品。簡單工廠模式通過這種做法實現(xiàn)了對責(zé)任的分割宴凉。
壞處
當(dāng)系統(tǒng)中的具體產(chǎn)品類不斷增多時候誊锭,可能會出現(xiàn)要求工廠類根據(jù)不同條件創(chuàng)建不同實例的需求.這種對條件的判斷和對具體產(chǎn)品類型的判斷交錯在一起,很難避免模塊功能的蔓延弥锄,對系統(tǒng)的維護和擴展非常不利丧靡;只適用于簡單的業(yè)務(wù)情況蟆沫。這樣全部的判斷集中在工廠類中也不好維護。
例子
定義接口--抽象產(chǎn)品
public interface Shape
{ void draw();
}
創(chuàng)建實現(xiàn)接口的實體類--具體產(chǎn)品類
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.");
}
}
創(chuàng)建一個工廠類--取決于條件的給予温治,返回不同的實例饭庞。
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 的對象但绕,并調(diào)用它的 draw 方法 這里向上轉(zhuǎn)型
Shape shape1 = shapeFactory.getShape("CIRCLE");
//調(diào)用 Circle 的 draw 方法
shape1.draw();
//獲取 Rectangle 的對象救崔,并調(diào)用它的 draw 方法
Shape shape2 = shapeFactory.getShape("RECTANGLE");
//調(diào)用 Rectangle 的 draw 方法
shape2.draw();
//獲取 Square 的對象惶看,并調(diào)用它的 draw 方法
Shape shape3 = shapeFactory.getShape("SQUARE");
//調(diào)用 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]