天天看點

淺談JAVA設計模式之——抽象工廠模式(AbstractFactoty)

一、概述:

提供一個建立一系列相關或互相依賴對象的接口,而無需指定它們具體的類。

二、為何使用

工廠模式是我們最常用的模式了,著名的Jive論壇 ,就大量使用了工廠模式,工廠模式在Java程式系統可以說是随處可見。

 為什麼工廠模式是如此常用?因為工廠模式就相當于建立執行個體對象的new,我們經常要根據類Class生成執行個體對象,如A a=new A() 工廠模式也是用來建立執行個體對象的,是以以後new時就要多個心眼,是否可以考慮實用工廠模式,雖然這樣做,可能多做一些工作,但會給你系統帶來更大的可擴充性和盡量少的修改量

三、實用性

  • 一個系統要獨立于它的産品的建立、組合和表示時。
  • 一個系統要由多個産品系列中的一個來配置時。
  • 當你要強調一系列相關的産品對象的設計以便進行聯合使用時。
  • 當你提供一個産品類庫,而隻想顯示它們的接口而不是實作時。

四、參與者

  • AbstractFactory 聲明一個建立抽象産品對象的操作接口。
  • ConcreteFactory 實作建立具體産品對象的操作。
  • AbstractProduct 為一類産品對象聲明一個接口。
  • ConcreteProduct 定義一個将被相應的具體工廠建立的産品對象。實作AbstractProduct接口。
  • Client 僅使用由AbstractFactory和AbstractProduct類聲明的接口

五、類圖

淺談JAVA設計模式之——抽象工廠模式(AbstractFactoty)

六、示例

AbstractFactory:定義抽象工程類IAnimalFactory

package com.lyz.design.abstractfactory;
/**
 * 這個接口就是類圖中辨別的
 * AbstractFactory抽象工廠
 * @author liuyazhuang
 *
 */
public interface IAnimalFactory {
    /**
     * 定義建立Icat接口執行個體的方法
     * @return
     */
    ICat createCat();
    /**
     * 定義建立IDog接口執行個體的方法
     * @return
     */
    IDog createDog();
}
      

ConcreteFactory:建立抽象工廠類的兩個實作類,WhiteAnimalFactory和BlackAnimalFactory

package com.lyz.design.abstractfactory;
/**
 * IAnimalFactory抽象工廠的實作類
 * @author liuyazhuang
 *
 */
public class WhiteAnimalFactory implements IAnimalFactory {
 
    public ICat createCat() {
        return new WhiteCat();
    }
 
    public IDog createDog() {
        return new WhiteDog();
    }
 
}      
package com.lyz.design.abstractfactory;
/**
 * IAnimalFactory抽象工廠的實作類
 * @author liuyazhuang
 */
public class BlackAnimalFactory implements IAnimalFactory {
  @Override
    public ICat createCat() {
        return new BlackCat();
    }
 
    public IDog createDog() {
        return new BlackDog();
    }
 
}      

AbstractProduct:定義抽象工廠中要生産的抽象産品接口ICat和IDog

package com.lyz.design.abstractfactory;
/**
 * 類圖中定義的AbstractProduct
 * 指定工廠生産的産品
 * @author liuyazhuang
 *
 */
public interface ICat {
    /**
     * 定義方法
     */
    void eat();
}      
package com.lyz.design.abstractfactory;
/**
 * 類圖中定義的AbstractProduct
 * 指定工廠生産的産品
 * @author liuyazhuang
 *
 */
public interface IDog {
 
   /**
     * 定義方法
     */
    void eat();
}
      

ConcreteProduct:建立産品的實作類BlackCat、BlackDog、WhiteCat、WhiteDog

package com.lyz.design.abstractfactory;
/**
 * ICat接口的實作類
 * @author liuyazhuang
 *
 */
public class BlackCat implements ICat {
  @Override
    public void eat() {
        System.out.println("The black cat is eating!");
    }
}      
package com.lyz.design.abstractfactory;
 
/**
 * IDog的實作類
 * @author liuyazhuang
 */
public class BlackDog implements IDog {
  @Override
    public void eat() {
        System.out.println("The black dog is eating");
    }
}      
package com.lyz.design.abstractfactory;
/**
 * ICat的實作類
 * @author liuyazhuang
 *
 */
public class WhiteCat implements ICat {
  @Override
    public void eat() {
        System.out.println("The white cat is eating!");
    }
}      
package com.lyz.design.abstractfactory;
/**
 * IDog的實作類
 * @author liuyazhuang
 *
 */
public class WhiteDog implements IDog {
  @Override
    public void eat() {
        System.out.println("The white dog is eating!");
    }
 
}      

Client:定義一個測試類Test

package com.lyz.design.abstractfactory;
 
/**
 * 測試類
 * @author liuyazhuang
 *
 */
public class Test {
  public static void main(String[] args) {
      IAnimalFactory blackAnimalFactory = new BlackAnimalFactory();
      ICat blackCat = blackAnimalFactory.createCat();
      blackCat.eat();
      IDog blackDog = blackAnimalFactory.createDog();
      blackDog.eat();
      
      IAnimalFactory whiteAnimalFactory = new WhiteAnimalFactory();
      ICat whiteCat = whiteAnimalFactory.createCat();
      whiteCat.eat();
      IDog whiteDog = whiteAnimalFactory.createDog();
      whiteDog.eat();
  }
}      

輸出結果

The black cat is eating!
The black dog is eating
The white cat is eating!
The white dog is eating!      

七、總結

由此可見,工廠方法确實為系統結構提供了非常靈活強大的動态擴充機制,隻要我們更換一下具體的工廠方法,系統其他地方無需一點變換,就有可能将系統功能進行改頭換面的變化