java工廠模式

講解三種工廠模式,並比較各自優缺點

簡單工廠

/**
 * @author Gjing
 * 抽象產品
 **/
interface Product {
    void create();
}

/**
 * 產品A
 */
class ProductA implements Product {
    @Override
    public void create() {
        System.out.println("產品A");
    }
}

/**
 * 產品B
 */
class ProductB implements Product {
    @Override
    public void create() {
        System.out.println("產品B");
    }
}

/**
 * 產品工廠
 */
class ProductFactory {
    Product getProduct(Integer type) {
        switch (type) {
            case 1:
                return new ProductA();
            case 2:
                return new ProductB();
            default:
                throw new NullPointerException("沒有你要的產品");
        }
    }
}

調用:

/**
* @author Gjing
**/
public class Test {
   public static void main(String[] args) {
       ProductFactory factory = new ProductFactory();
       Product productA = factory.getProduct(1);
       productA.create();
       Product productB = factory.getProduct(2);
       productB.create();
   }
}

工廠模式

  • 工廠
/**
 * @author Gjing
 * 抽象工廠
 **/
public interface Factory {
    /**
     * 生產產品
     * @return Product
     */
    Product create();
}

/**
 * @author Gjing
 * 創建產品A 的工廠A
 **/
class FactoryA implements Factory {
    @Override
    public Product create() {
        return new ProductA();
    }
}

/**
 * @author Gjing
 * 工廠B負責創建產品B
 **/
class FactoryB implements Factory {
    @Override
    public Product create() {
        return new ProductB();
    }
}
  • 產品
/**
 * @author Gjing
 * 抽象產品
 **/
interface Product {
    void create();
}

/**
 * 產品A
 */
class ProductA implements Product {
    @Override
    public void create() {
        System.out.println("產品A");
    }
}

/**
 * 產品B
 */
class ProductB implements Product {
    @Override
    public void create() {
        System.out.println("產品B");
    }
}

調用

public class Test {
    public static void main(String[] args) {
        FactoryA factoryA = new FactoryA();
        factoryA.create().create();

        FactoryB factoryB = new FactoryB();
        factoryB.create().create();
    }
}

抽象工廠模式

  • 工廠
/**
 * @author Gjing
 **/
public interface Factory {
    Product getProductA();

    Product getProductB();
} 

class FactoryA implements Factory {
    @Override
    public Product getProductA() {
        return new ProductAa();
    }

    @Override
    public Product getProductB() {
        return new ProductBb();
    }
}
  • 產品
/**
 * @author Gjing
 * 抽象產品
 **/
abstract class Product {
    abstract void create();
}

/**
 * 抽象產品A
 */
abstract class ProductA extends Product {
    @Override
    abstract void create();
}

/**
 * 抽象產品A的具體某個產品
 */
class ProductAa extends ProductA {
    @Override
    void create() {
        System.out.println("產品A");
    }
}

/**
 * 抽象產品B
 */
abstract class ProductB extends Product {
    @Override
    abstract void create();
}

/**
 * 抽象產品B的具體某個產品
 */
class ProductBb extends ProductB {
    @Override
    void create() {
        System.out.println("產品B");
    }
}

調用

public class Test {
    public static void main(String[] args) {
        Factory factory = new FactoryA();
        factory.getProductA().create();
        factory.getProductB().create();
    }
}

以上爲三種不同工廠模式,他們各自的優缺點是啥?

  • 簡單工廠

優點:將創建使用工作分開,不必關心類對象如何創建,實現瞭解耦;
缺點:違背“開放 - 關閉原則”,一旦添加新產品就不得不修改工廠類的邏輯,這樣就會造成工廠邏輯過於複雜。

  • 工廠模式
a. 優點:      
    1. 符合開-閉原則:新增一種產品時,只需要增加相應的具體產品類和相應的工廠子類即可    
    2. 符合單一職責原則:每個具體工廠類只負責創建對應的產品     
b. 缺點:    
    1. 增加了系統的複雜度:類的個數將成對增加      
    2. 增加了系統的抽象性和理解難度     
    3. 一個具體工廠只能創建一種具體產品
  • 抽象工廠
優點:
1.降低耦合
2.符合開-閉原則
3.符合單一職責原則
4.不使用靜態工廠方法,可以形成基於繼承的等級結構。
缺點:難以擴展新種類產品

總結

  • 角色不同

    • 簡單工廠:具體工廠、抽象產品、具體產品
    • 工廠方法:抽象工廠、具體工廠、抽象產品、具體產品
    • 抽象工廠:抽象工廠、具體工廠、抽象產品族、抽象產品、具體產品
  • 定義

    • 簡單工廠:由一個工廠類根據傳入的參數,動態決定應該創建哪一個產品類(繼承自一個父類或接口)的實例。
    • 工廠方法:定義工廠父類負責定義創建對象的公共接口,而子類則負責生成具體的對象
    • 抽象工廠:提供一個創建一系列相關或相互依賴對象的接口,而無須指定它們具體的類;具體的工廠負責實現具體的產品實例。
  • 對比

    • 工廠方法模式解決了簡單工廠模式的“開放 - 關閉原則
    • 抽象工廠模式解決了工廠方法模式一個具體工廠只能創建一類產品

以上爲個人理解,如理解有誤歡迎各位指正

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章