天天看點

深入淺出設計模式 ------ Abstract Factory(抽象工廠)

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

二. 結構

深入淺出設計模式 ------ Abstract Factory(抽象工廠)

三. 參與者        

Product (Fruit和Leaf兩個抽象産物) : 抽象生産者接口;

TreeFruit(樹上的水果)、 TreeLeaf(樹上的葉子)、 GroundFruit(地上的水果)、 GroundLeaf(地上的葉子) : 實際的自然産物;

NatureFactory: 抽象的自然制造工廠, 用于生産水果和葉子;

TreeFactory、 LeafFactory : 實際的自然制造工廠, 用于生産樹上或地上的水果和葉子。

四. 适用性 

- 一個系統獨立(解耦)于它的産品的建立、 組合和表示時

- 一個系統要由多個它的産品的建立、組合(以上的自然界需要水果和葉子的組合)和表示時

- 強調一系列相關的産品對象的設計以便進行聯合使用時

- 提供一個産品庫, 而隻想顯示接口(面向接口程式設計)而不是實作時。

五. 具體實作

抽象工廠: 制造大自然中的葉子和水果 

package com.wenniuwuren.abstractfactory;
/**
 * 抽象工廠: 制造大自然中的葉子和水果 
 * @author wenniuwuren
 *
 */
public interface NatureFactory {

	public Fruit createFruit();
	
	public Leaf createLeaf();
}
           

工廠實作類: 制造地面上的葉子和水果

package com.wenniuwuren.abstractfactory;

/**
 * 工廠實作類: 制造地面上的葉子和水果
 * @author wenniuwuren
 *
 */

public class GroundFactory implements NatureFactory {

	@Override
	public Fruit createFruit() {
		return new GroundFruit();
	}

	@Override
	public Leaf createLeaf() {
		return new GroundLeaf();
	}

}
           

工廠實作類:制造樹上的水果和葉子

package com.wenniuwuren.abstractfactory;

/**
 * 工廠實作類:制造樹上的水果和葉子
 * @author wenniuwuren
 *
 */
public class TreeFactory implements NatureFactory {

	@Override
	public Fruit createFruit() {
		return new TreeFruit();
	}

	@Override
	public Leaf createLeaf() {
		return new TreeLeaf();
	}

}
           

水果接口:

package com.wenniuwuren.abstractfactory;

/**
 * 水果接口
 * @author wenniuwuren
 *
 */
public interface Fruit {
  public String product();
}
           

水果實作類:地上的水果

package com.wenniuwuren.abstractfactory;

/**
 * 水果實作類:地上的水果
 * @author wenniuwuren
 *
 */
public class GroundFruit implements Fruit {

	@Override
	public String product() {
		return "GroundFruit";
	}

}
           

水果實作類: 樹上的水果

package com.wenniuwuren.abstractfactory;

/**
 * 水果實作類: 樹上的水果
 * @author wenniuwuren
 *
 */
public class TreeFruit implements Fruit {

	@Override
	public String product() {
		return "TreeFruit";
	}

}
           

葉子接口:

package com.wenniuwuren.abstractfactory;

/**
 * 葉子接口
 * @author wenniuwuren
 *
 */
public interface Leaf {
	public String product();
}
           

葉子實作類: 地上的葉子

package com.wenniuwuren.abstractfactory;

/**
 * 葉子實作類: 地上的葉子
 * @author wenniuwuren
 *
 */
public class GroundLeaf implements Leaf {

	@Override
	public String product() {
		return "GroundLeaf";
	}

}
           

葉子實作類:樹上的葉子

package com.wenniuwuren.abstractfactory;

/**
 * 葉子實作類:樹上的葉子
 * @author wenniuwuren
 *
 */
public class TreeLeaf implements Leaf {

	@Override
	public String product() {
		return "TreeLeaf";
	}

}
           

測試類:Client

package com.wenniuwuren.abstractfactory;

public class Client {

	public static void main(String[] args) {
		
		// 生産樹上的水果
		//Fruit fruit = new TreeFruit(); //沒用抽象工廠時的調用方法
		NatureFactory natureFactory = new TreeFactory();
		Fruit fruit = natureFactory.createFruit();
		System.out.println(fruit.product()); 
		
		// 生産樹上的葉子
		Leaf leaf = natureFactory.createLeaf();
		System.out.println(leaf.product());
		
		// 生産地上的水果
		natureFactory = new GroundFactory();
		fruit = natureFactory.createFruit();
		System.out.println(fruit.product()); 
		
		// 生産地上的葉子
		leaf = natureFactory.createLeaf();
		System.out.println(leaf.product());
	}
}
           

測試結果:

TreeFruit

TreeLeaf

GroundFruit

GroundLeaf

本文可以和筆者的深入淺出設計模式 ------ Factory Method(工廠方法)參照着看, 可以區分這三個工廠模式的不同。

參考書籍:

                《設計模式 : 可複用面向對象軟體的基礎》

                《Effective Java》

                《Head First 設計模式》

繼續閱讀