1. 程式人生 > >設計模式之--工廠方法模式(FactoryMethod )

設計模式之--工廠方法模式(FactoryMethod )


工廠方法模式(FactoryMethod )
是建立型模式之一,

        工廠方法(Factory Method)模式的意義是定義一個建立產品物件的工廠介面,將實際建立工作推遲到子類當中。核心工廠類不再負責產品的建立,這樣核心類成為一個抽象工廠角色,僅負責具體工廠子類必須實現的介面,這樣進一步抽象化的好處是使得工廠方法模式可以使系統在不修改具體工廠角色的情況下引進新的產品。

  工廠方法模式是簡單工廠模式的衍生,解決了許多簡單工廠模式的問題。首先完全實現‘開-閉 原則’,實現了可擴充套件。其次更復雜的層次結構,可以應用於產品結果複雜的場合。

類圖

public interface Vehicle {
	/**
	 * 啟動
	 */
	public void star();
	/**
	 * 跑
	 */
	public void run();
	/**
	 * 停止
	 */
	public void stop();
}
/**
 * 子類產品(公交車)
 * @author 林道銀
 *
 */
public class Bus implements Vehicle {

	/**
	 * 啟動
	 */
	@Override
	public void star() {
		// TODO Auto-generated method stub
		System.out.println("公交車啟動了!");
	}
	/**
	 * 跑起來
	 */
	@Override
	public void run() {
		// TODO Auto-generated method stub
		System.out.println("公交車跑起來了!");
	}

	/**
	 * 停下來
	 */
	@Override
	public void stop() {
		// TODO Auto-generated method stub
		System.out.println("公交車停下來了!");
	}
}
/**
 * 子類產品(轎車)
 * @author 林道銀
 *
 */
public class Car implements Vehicle {

	@Override
	public void star() {
		// TODO Auto-generated method stub
		System.out.println("小轎車啟動了!");
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		System.out.println("小轎車跑起來了!");
	}

	@Override
	public void stop() {
		// TODO Auto-generated method stub
		System.out.println("小轎車停下來了!");
	}
}
/**
 * 工廠方法類
 * @author 林道銀
 *
 */
public interface VehicleFactory {
	
	/**
	 * 例項化子類產品
	 * @return
	 */
	public Vehicle createVehicle();
}
/**
 * 生產轎車的工廠
 * @author 林道銀
 *
 */
public class CarFactory implements VehicleFactory {

	/**
	 * 例項化子類工廠(轎車)
	 */
	@Override
	public Vehicle createVehicle() {
		// TODO Auto-generated method stub
		return new Car();
	}
}
/**
 * 生產公交車的工廠類
 * @author 林道銀
 *
 */
public class BusFctory implements VehicleFactory {

	/**
	 * 例項化子類工廠(公交車)
	 */
	@Override
	public Vehicle createVehicle() {
		// TODO Auto-generated method stub
		return new Bus();
	}
}
public class Test {
	public static void main(String[] args) {
		
		VehicleFactory vehicle=new CarFactory();
		
		vehicle.createVehicle().star();
		vehicle.createVehicle().run();
		vehicle.createVehicle().stop();
	}
}


       工廠方法模式實現時,客戶端需要決定例項化那一個工廠來實現汽車類,選擇判斷的問題還是存在的,也就是說,工廠方法把簡單工廠的內部邏輯判斷移到了客戶端程式碼來進行.你想要加功能,本來是改工廠類的,而現在是修改客戶端(如果想避免修改客戶端程式碼可以利用'反射')

       工廠方法模式是簡單工廠模式的進一步抽象和推廣.由於使用了多型性,工廠方法模式保持了簡單工廠模式的優點,而且克服了它的缺點但缺點是由於每加一個產品,就需要加一個產品工廠類,增加了額外的開發量.

工廠方法模式的應用

     工廠方法經常用在以下兩種情況中:

  第一種情況是對於某個產品,呼叫者清楚地知道應該使用哪個具體工廠服務,例項化該具體工廠,生產出具體的產品來。Java Collection中的iterator() 方法即屬於這種情況。

  第二種情況,只是需要一種產品,而不想知道也不需要知道究竟是哪個工廠為生產的,即最終選用哪個具體工廠的決定權在生產者一方,它們根據當前系統的情況來例項化一個具體的工廠返回給使用者,而這個決策過程這對於使用者來說是透明的。