天天看點

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.不使用靜态工廠方法,可以形成基于繼承的等級結構。
缺點:難以擴充新種類産品           

總結

  • 角色不同
    • 簡單工廠:具體工廠、抽象産品、具體産品
    • 工廠方法:抽象工廠、具體工廠、抽象産品、具體産品
    • 抽象工廠:抽象工廠、具體工廠、抽象産品族、抽象産品、具體産品
  • 定義
    • 簡單工廠:由一個工廠類根據傳入的參數,動态決定應該建立哪一個産品類(繼承自一個父類或接口)的執行個體。
    • 工廠方法:定義工廠父類負責定義建立對象的公共接口,而子類則負責生成具體的對象
    • 抽象工廠:提供一個建立一系列相關或互相依賴對象的接口,而無須指定它們具體的類;具體的工廠負責實作具體的産品執行個體。
  • 對比
    • 工廠方法模式解決了簡單工廠模式的“開放 - 關閉原則
    • 抽象工廠模式解決了工廠方法模式一個具體工廠隻能建立一類産品

以上為個人了解,如了解有誤歡迎各位指正

繼續閱讀