Java 之工廠方法和抽象工廠模式

1. 概念

    工廠方法:一抽象產品類派生出多個具體產品類;一抽象工廠類派生出多個具體工廠類;每個具體工廠類只能創建一個具體產品類的實例。

    即定義一個創建對象的接口(即抽象工廠類),讓其子類(具體工廠類)決定實例化哪一個類(具體產品類)。“一對一”的關係。

 

    抽象工廠:多個抽象產品類,派生出多個具體產品類;一個抽象工廠類,派生出多個具體工廠類;每個具體工廠類可創建多個具體產品類的實例。

    即提供一個創建一系列相關或相互依賴對象的接口,而無需指定他們的具體的類。“一對多”的關係。

2. UML

 工廠方法:

 

 

抽象工廠:

3. 代碼

工廠方法:

 

複製代碼
public interface Product
{       
}

public interface Creator
{
       public Product factory();
}

public class ConcreteProduct1 implements Product
{
       public ConcreteProduct1()
       {
              System.out.println("ConcreteProduct1被創建");
       }
}

public class ConcreteProduct2 implements Product
{
       public ConcreteProduct2()
       {
              System.out.println("ConcreteProduct2被創建");
       }
 
}

public class ConcreteCreator1 implements Creator
{
       public Product factory()
       {
              return new ConcreteProduct1();
       }
}

public class ConcreteCreator2 implements Creator
{
       public Product factory()
       {
              return new ConcreteProduct2();
       }
}
 
public class Client
{
       private static Creator creator1, creator2;
       private static Product prod1, prod2;

       public static void main(String[] args)
       {
              creator1 = new ConcreteCreator1();
              prod1 = creator1.factory();
              System.out.println("----------------------------");
              creator2 = new ConcreteCreator2();
              prod2 = creator2.factory();
       }
}
複製代碼

抽象工廠:

 

複製代碼
//定義不同的產品之間的一定具備的標準,用interface實現 
//其中的method()方法可看作提取出不同產品的共性,如手機都有類似的功能 
interface IProductA{ 
  public void method(); 
} 

interface IProductB{ 
  public void method(); 
} 

//實現了產品標準實現的一系列具體產品 
//由於已經設計好A1由廠商1生產,故以下輸出代碼有“廠商x” 
class ProductA1 implements IProductA{ 
  public void method() { 
    System.out.println("廠商1    生產ProductA1 ..."); 
  } 
} 

class ProductA2 implements IProductA{ 
  public void method() { 
    System.out.println("廠商2    生產ProductA2 ..."); 
  } 
} 

class ProductB1 implements IProductB{ 
  public void method() { 
    System.out.println("廠商1    生產ProductB1 ..."); 
  } 
} 

class ProductB2 implements IProductB{ 
  public void method() { 
    System.out.println("廠商2    生產ProductB2 ..."); 
  } 
} 

//每一種牌子的產品生產工廠,即不同的廠商負責自己牌子產品的生產 
abstract class Factory1{ 
  abstract IProductA getProductA1(); 
  abstract IProductB getProductB1(); 
} 

abstract class Factory2{ 
  abstract IProductA getProductA2(); 
  abstract IProductB getProductB2(); 
} 

//具體的工廠用來生產相關的產品 
class ConcreteFactory1 extends Factory1{ 
  public IProductA getProductA1() { 
    return new ProductA1(); 
  } 
  public IProductB getProductB1() { 
    return new ProductB1(); 
  } 
} 

class ConcreteFactoryB extends Factory2{ 
  public IProductA getProductA2() { 
    return new ProductA2(); 
  } 
  public IProductB getProductB2() { 
    return new ProductB2(); 
  } 
} 

//測試類 
public class Client { 
  public static void main(String[] args) { 
    //廠商1負責生產產品A1、B1 
    Factory1 factory1 = new ConcreteFactory1(); 
    IProductA productA1 = factory1.getProductA1(); 
    IProductB productB1 = factory1.getProductB1(); 
     
    productA1.method(); 
    productB1.method(); 
     
    //廠商2負責生產產品A2、B2 
    Factory2 factory2 = new ConcreteFactoryB(); 
    IProductA productA2 = factory2.getProductA2(); 
    IProductB productB2 = factory2.getProductB2(); 
     
    productA2.method(); 
    productB2.method(); 
  } 
}
複製代碼

4. 應用場景

工廠方法:

在以下情況下,適用於工廠方法模式:

(1) 當一個類不知道它所必須創建的對象的類的時候。

(2) 當一個類希望由它的子類來指定它所創建的對象的時候。

(3) 當類將創建對象的職責委託給多個幫助子類中的某一個,並且你希望將哪一個幫助子類是代理者這一信息局部化的時候。

抽象工廠:

(1) 一個系統不應當依賴於產品類實例如何被創建、組合和表達的細節,這對於所有形態的工廠模式都是重要的。

(2) 這個系統有多於一個的產品族,而系統只消費其中某一產品族。

(3) 同屬於同一個產品族的產品是在一起使用的,這一約束必須在系統的設計中體現出來。

(4) 系統提供一個產品類的庫,所有的產品以同樣的接口出現,從而使客戶端不依賴於實現。

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