1. 程式人生 > >軟體設計模式——工廠方法模式(Factory Method)

軟體設計模式——工廠方法模式(Factory Method)

工廠方法模式去掉了簡單工廠模式中工廠方法的靜態屬性,使得它可以被子類繼承。通俗的來說就是把簡單工廠模式裡面的分支語句給去掉,將每個具體產品的例項化過程放到不同的工廠子類中去。相應的角色如下:

(1)抽象工廠角色:這是工廠方法模式的核心,它與應用程式無關。是具體工廠角色必須實現的介面或者必須繼承的父類。
(2)具體工廠角色:它含有和具體業務邏輯有關的程式碼。由應用程式呼叫以建立對應的具體產品的物件。
(3)抽象產品角色:它是具體產品繼承的父類或者是實現的介面。在 java 中一般有抽象類 或者介面來實現。
(4)具體產品角色:具體工廠角色所建立的物件就是此角色的例項。在 java 中由具體的類 來實現。
這裡寫圖片描述


工廠方法模式使用繼承自抽象工廠的多個子類來代替簡單工廠模式中的“工廠類角色”。當有新的產品產生時,只要按照抽象產品角色 、抽象工廠角色提供的合同來生成 ,那麼就可以被客戶使用,而不必去修改已有的程式碼。

//抽象產品角色
public interface Car {
    public void drive();
}

//具體產品角色
public class Benz implements Car
{
    public void drive() {
        System.out.println("Driving Benz!");
    }
}

//具體產品角色
public
class Audi implements Car { public void drive() { System.out.println("Driving Audi!"); } } ...... //抽象工廠角色 public interface Driver { public Car driveCar(); } //具體工廠角色 public class BenzDriver implements Driver { @Override public Car driveCar() { return new Benz(); } } //具體工廠角色
public class AudiDriver implements Driver { @Override public Car driveCar() { return new Audi(); } } ...... //客戶使用 public class Magnate { public static void main (String [] args) { Driver driver = new BenzDriver(); Car car = driver.driveCar(); car.drive(); } } 輸出結果:Driving Benz!

可以看出工廠方法的加入,使得物件的數量成倍增加。當產品種類非常多時,會出現大量的與之對應的工廠物件,這不是我們所希望的。因為如果不能避免這種情況,可以使用簡單工廠模式與工廠方法模式相結合的方式來減少工廠類。
下面情況可以考慮使用工廠方法模式:
(1)當客戶程式不需要知道要使用物件的建立過程。
(2)客戶程式使用的物件存在變動的可能, 者根本就不知道使用 哪一個具體的物件。
簡單工廠模式與簡單工廠方法模式真正的避免了程式碼的改動了?沒有。在簡單工廠模式中,新產品的加入要修改工廠角色中的判斷語句;而在工廠方法模式中,要麼將判斷邏輯留在抽象工廠角色中,要麼在客戶程式中將具體 工廠寫死(就象上面的例子一樣)。而且產品物件建立條件的改變必然會引起 工廠角色的修改。這種情況在java中利用反射機制與配置檔案的巧妙結合突破了限制。