Java設計模式二:抽象工廠模式(Abstract Factory)/工廠方法(Factory Method)


工廠模式提供創建對象的接口。

工廠模式分為三類:簡單工廠模式(Simple Factory), 工廠方法模式(Factory Method)和抽象工廠模式(Abstract Factory).
GOF在《設計模式〉中將工廠模式分為兩類:工廠方法模式(Factory Method)和抽象工廠模式(Abstract Factory)。

1. 簡單工廠模式(Simple Factory)
簡單工廠模式又叫做靜態工廠方法模式。簡單工廠模式的實質是由一個工廠類根據傳入的參數,動態決定應該創建哪一個產品類(這些產品類繼承自一個父類或接口)的實例。
該模式中包含的角色及職責:
工廠(Creator)角色:它是簡單工廠模式的核心,負責實現創建所有實例的內部邏輯。工廠類可以被外界直接調用,創建所需要的產品對象。
抽象產品角色:它負責描述所有實例所共有的公共接口。
具體產品角色:是簡單工廠模式的創建目標,所有創建的對象都是充當這個角色的某個具體類的實例。

缺點:在工廠類中集中了所有實例的創建邏輯,違反了高內聚責任分配原則,將全部創建邏輯集中到了一個工廠類中;對系統的維護和擴展不利;

使用場景:負責創建的對象比較少;客戶只知道傳入工廠類的參數,對於如何創建對象的邏輯不關心;容易違反高內聚責任分配原則,所以只在很簡單的情況下應用;

類圖:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

實例:
//抽象產品角色
public interface IProduct
{
    public void saleProduct();
}
//具體產品角色
public class Product_A implements IProduct
{
    @Override
    public void saleProduct(){
        ...        
    }

}
//具體產品角色
public class Product_B implements IProduct
{
    @Override
    public void saleProduct(){
        ...        
    }

}
//工廠角色
public class Creator
{
    public IProduct createProduct(int productFlag){
        switch(productFlag){
            case 1:
                return new Product_A();
            case 2:
                return new Product_B();
            default:
                return null;
        }
    }
}

2. 工廠方法模式(Factory Method)
工廠方法模式是簡單工廠方法模式的衍生,它的核心工廠類不再負責產品的創建,這樣核心類成為一個抽象工廠角色,僅負責具體工廠子類必須實現的接口,使得系統可以在不修改具體工廠角色的情況下引用新的產品。
在這個模式中,一個抽象工廠對應一個抽象產品,一個具體工廠對應一個具體產品。
工廠方法模式是最典型的模板方法模式(Template Method Pattern)應用。

 

該模式中包含的角色及職責: 

 

抽象工廠(Creator)角色:工廠方法模式的核心,任何在模式中創建的對象的工廠必須實現這個接口。
具體工廠(Concrete Creator)角色:實現抽象工廠接口的具體工廠類,包含應用程序的邏輯。
抽象產品(Product)角色:產品對象的共同父類或共同擁有的接口。
具體產品(Concrete Product)角色:實現了抽象產品角色定義的接口,其具體產品有專門的具體工廠創建。

使用場景:
對於某個產品,調用者清楚知道應該使用哪個具體工廠服務,實例化該具體工廠,生產出具體的產品來;
只是需要一種產品,對於那個工廠生產的並不關心,最終選用哪個具體工廠由生產者一方決定,它根據當前系統的情況來實例化一個具體的工廠返回給使用者,這個決策過程對於使用者來說是透明的。

類圖:
 

 

 

 

 

 

 

 

 

 

 

實例:
//抽象工廠
public interface Creator{
       public Light factory();
}
//抽象產品
public interface Light{
    public void TurnOn();
    public void TrunOff();
}
//具體產品
public class BullbLight implements Light{
    public void TurnOn(){
    }

    public void TrunOff(){
    }
}
//具體產品
public class TubeLight implements Light{
    public void TurnOn(){
    }

    public void TrunOff(){
    }
}
//具體工廠
public class BullbCreator implements Creator{
       public Light factory(){
        return new BullbLight();
    }
}
//具體工廠
public class TubeCreator implements Creator{
       public Light factory(){
        return new TubeLight();
    }
}
public class Client{
       public static void main(String[] args){
              Creator create = new BullbCreator();
          Light bullbLight = create.factory();
          bullbLight.TurnOn();

              Creator create1 = new TubeCreator();
          Light tubebLight = create.factory();
          tubebLight.TurnOn();

       }
}

3. 抽象工廠模式(Abstract Factory)
抽象工廠模式是指當有多個抽象角色時,使用的一種工廠模式。抽象工廠模式可以向客戶端提供一個接口,使客戶端在不必指定產品的具體情況下,創建多個產品族中的產品對象。

類圖:

 

實例:
//抽象工廠角色
public interface AbstractFactory{
  public ProductA createProductA();
  public ProductB createProductB();
}

//抽象產品類A
public interface AbstractProductA
{
}

//抽象產品類B
public interface AbstractProductB
{
}

//具體產品類ProdcutA1
public class ProductA1 implements AbstractProductA
{
  public ProductA1()
  {
  }
}

//具體產品類ProdcutA2
public class ProductA2 implements AbstractProductA
{
  public ProductA2()
  {
  }
}

//具體產品類ProductB1
public class ProductB1 implements AbstractProductB
{
  public ProductB1()
  {
  }
}

//具體產品類ProductB2
public class ProductB2 implements AbstractProductB
{
  public ProductB2()
  {
  }
}

//具體工廠類1
public class ConcreteFactory1 implements AbstractFactory{
  public AbstractProductA createProductA(){
  return new ProductA1();
  }
  public AbstractProductB createProductB(){
  return new ProductB1();
    }
}

//具體工廠類2
public class ConcreteFactory2 implements Creator{
  public AbstractProductA createProductA(){
  return new ProductA2();
  }
  public AbstractProductB createProductB(){
  return new ProductB2();
  }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM