(Abstract Factory)抽象工廠模式的Java實現

籤:Java 抽象工廠模式 休閒 Abstract Factory 職場            原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://haolloyin.blog.51cto.com/1177454/332802                                  抽象工廠模式(Abstract Factory):爲創建一組相關或者互相依賴的對象提供一個接口,而無需指定它們對應的具體類。通用類圖如下:例如,我們現在有兩種產品AB,而產品AB分別都有兩個廠商12進行生產,在這裏我們把不同的廠商1、廠商2理解爲牌子1和牌子2,那麼廠商1就生產A1B1,廠商2生產A2B2此時,不同的廠商肯定要生產自己的產品(如A1B1),每個廠商都有自己的一系列產品,這就與上面抽象工廠模式的描述類似了。該例子的類圖如下:具體代碼實現如下://定義不同的產品之間的一定具備的標準,用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();
  }
}
運行結果:

廠商1  生產ProductA1 ...            廠商1  生產ProductB1 ...            廠商2  生產ProductA2 ...            廠商2  生產ProductB2 ...            
 其實,上例中本來可以不用到了兩個抽象工廠,只剩一個也可,但是這樣子與我們現實生活中不同廠商各自生產自己的產品有點不同,所以就將其分開爲兩個了,也就是將兩個廠商完全地分離開。由上面類圖可以知道,一旦任何一個廠商開發出了產品C的話,那麼這個廠商肯定需要擴展自己的工廠來投入到C產品的生產中,那麼此時工廠1和工廠2就需要進行一定的改變了,這很明顯不符合開閉原則。

本文出自 “螞蟻” 博客,請務必保留此出處http://haolloyin.blog.51cto.com/1177454/332802


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