01 簡單工廠模式

結構

  1. Factory(工廠角色):工廠角色即工廠類,它是簡單工廠模式的核心,負責實現創建所有產品實例的內部邏輯;工廠類可以被外界直接調用,創建所需的產品對象;在工廠類中提供了靜態的工廠方法factoryMethod(),它的返回示例爲抽象產品類型Procut。
  2. Product(抽象產品角色):它是工廠類創建的所有對象的父類,封裝了各種產品對象的共有方法,它的引入將提高系統的靈活性,使得在工廠類中只需定義一個通用的工廠方法,因爲所有創建的具體產品對象都是其子類對象。
  3. ConcreteProduct(具體產品角色):它是簡單工廠模式的創建目標,所有被創建的對象都充當這個角色的某個具體類的實例。枚一個具體產品角色都繼承了抽象產品角色,需要實現在抽象產品中申明的抽象方法。

代碼

抽象產品角色

public abstract class Product {

    // 所有產品類的公共業務方法
    public void methodSample() {

    }

    // 聲明抽象業務方法
    public abstract void methodDiff();

}

具體產品A

public class ConcreteProductA extends Product {

    @Override
    public void methodDiff() {
        System.out.println("ConcreteProductA -A");
    }

}

具體產品B

public class ConcreteProductB extends Product {

    @Override
    public void methodDiff() {
        System.out.println("ConcreteProductB -B");
    }

}

工廠類

public class Factory {

    public static Product getProduct(String arg) {
        Product product = null;
        if ("A".equalsIgnoreCase(arg)) {
            product = new ConcreteProductA();
        } else if ("B".equalsIgnoreCase(arg)) {
            product = new ConcreteProductB();
        }
        return product;
    }

}

客戶端調用

public class Client {

    public static void main(String[] args) {
        Product productA = Factory.getProduct("A");
        productA.methodDiff();

        Product productB = Factory.getProduct("B");
        productA.methodDiff();
    }

}

執行結果

ConcreteProductA -A
ConcreteProductB -B

擴展

新增具體產品類C

public class ConcreteProductC extends Product {

    @Override
    public void methodDiff() {
        System.out.println("ConcreteProductC - C");
    }

}

工廠類方法需要修改

public class Factory {

    public static Product getProduct(String arg) {
        Product product = null;
        if ("A".equalsIgnoreCase(arg)) {
            product = new ConcreteProductA();
        } else if ("B".equalsIgnoreCase(arg)) {
            product = new ConcreteProductB();
        } else if ("C".equalsIgnoreCase(arg)) {
            product = new ConcreteProductC();
        }
        return product;
    }

}

優/缺點與適用環境

  1. 優點
  • 工廠類包含必要的判斷邏輯,可以決定在什麼時候創建哪一個產品類的實例,客戶端可以免除直接創建產品對象的職責,而僅僅“消費”產品,簡單工廠模式實現了對象創建和使用的分離。
  • 客戶端無須知道所創建的具體產品類的類名,只需要知道具體產品類所對應的參數即可,對於些複雜的類名,通過簡單工廠模式可以在一定程度上減少使用者的記憶量。
  • 通過引入配置文件,可以在不修改任何客戶端代碼的情況下更換和增加新的具體產品類,在一定程度上提高了系統的靈活性。
  1. 缺點
  • 由於工廠類集中了所有產品的創建邏輯,職責過重,一旦不能正常工作,整個系統都要受到影響。
  • 使用簡單工廠模式勢必會增加系統中類的個數(引入了新的工廠類),增加了系統的複雜度和理解難度。
  • 系統擴展困難,一旦添加新產品就不得不修改工廠邏輯,在產品類型較多時有可能造成工廠邏輯過於複雜,不利於系統的擴展和維護。
  • 簡單工廠模式由於使用了靜態工廠方法,造成工廠角色無法形成基於繼承的等級結構。
  1. 適用環境
  • 工廠類負責創建的對象比較少,由於創建的對象較少,不會造成工廠方法中的業務邏輯太過複雜。
  • 客戶端只知道傳人工廠類的參數,對於如何創建對象並不關心。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章