1. 程式人生 > >工廠模式01之簡單工廠

工廠模式01之簡單工廠

參考:Head First設計模式

概念

簡單工廠(Simple Factory)模式,又稱靜態工廠方法模式(Static Factory Method Pattern)。
簡單工廠可以理解為,定義一個工廠類,根據傳入的引數不同而返回不同的例項,這些例項通常有共同的父類。
雖然簡單工廠經常會被使用,但是並不能算作是一種設計模式,反而更像是一種程式設計習慣。

提出問題

當我們建立產品類物件時,會使用到new操作符,但是程式碼綁著具體類的例項會導致程式碼更脆弱,更缺乏彈性。
例項化這個活動不應該總是公開的進行。
否則一旦有變化或擴充套件,就必須重新開啟這段程式碼進行檢查和修改。
我們的原則是:“找出會變化的方面,把他們從不變的部分分離出來”。
即讓我們編寫的程式碼符合開放-關閉原則

思路

建立一個factory類,將建立產品類物件的程式碼放在factory類中,由factory類的物件專職建立產品類的物件。

UML圖

  • 工廠類 : Factory
  • 抽象產品類 : Product
  • 具體產品類 : ConcreteProductA 和 ConcreteProductB

例項

假設有一個披薩店,如果有了披薩訂單,運用簡單工廠處理披薩訂單。

類圖

程式碼:

  • 抽象類Pizza
package cn.edu.nwpu.simpleFactory;
/**
 * 
 * @author yylin
 *
 */
public abstract class Pizza { public void prepare() { System.out.println("prepare..."); } public void bake() { System.out.println("bake..."); } public void cut() { System.out.println("cut..."); } public void box() { System.out.println("box..."); } }
  • Pizza類的實現類CheesePizza
package cn.edu.nwpu.simpleFactory;
/**
 * 
 * @author yylin
 *
 */
public class CheesePizza extends Pizza {

}
  • Pizza類的實現類VeggiePizza
package cn.edu.nwpu.simpleFactory;
/**
 * 
 * @author yylin
 *
 */
public class VeggiePizza extends Pizza {

}
  • Pizza類的實現類ClamPizza
package cn.edu.nwpu.simpleFactory;
/**
 * 
 * @author yylin
 *
 */
public class ClamPizza extends Pizza {

}
  • Pizza類的實現類PepperoniPizza
package cn.edu.nwpu.simpleFactory;
/**
 * 
 * @author yylin
 *
 */
public class PepperoniPizza extends Pizza {

}
  • 簡單工廠類SimplePizzaFactory
package cn.edu.nwpu.simpleFactory;
/**
 * 
 * @author yylin
 *
 */
public class SimplePizzaFactory {

	public static Pizza creatPizza(String type) {
		// TODO 所有客戶用這個方法來例項化新物件
		Pizza pizza = null;
		if (type.equals("Cheese")) {
			pizza = new CheesePizza();
		} else if (type.equals("pepperoni")) {
			pizza = new PepperoniPizza();
		} else if (type.equals("clam")) {
			pizza = new ClamPizza();
		} else if (type.equals("veggie")) {
			pizza = new VeggiePizza();
		}
		return pizza;
	}
}
  • 客戶類PizzaStore
package cn.edu.nwpu.simpleFactory;
/**
 * 
 * @author yylin
 *
 */
public class PizzaStore {

	private SimplePizzaFactory factory = null;
	
	PizzaStore(SimplePizzaFactory factory) {
		this.factory = factory;
	}
	// 處理披薩訂單的方法
	public Pizza orderPizza(String type) {
		Pizza pizza = null;
		
		pizza = factory.creatPizza(type);
		
		pizza.prepare(); // 準備
		pizza.bake(); // 烘烤
		pizza.cut(); // 切片
		pizza.box(); //裝盒
		
		return pizza;
	}
}

總結

  1. 利用靜態方法定義一個簡單工廠,稱為靜態工廠靜態工廠不需要使用建立物件的方法來例項化物件,但是不能通過繼承來改變建立物件的區別。

  2. 簡單工廠的優點:實現物件的建立和物件的使用分離,將物件的建立交給專門的工廠類負責。

  3. 簡單工廠的缺點:工廠類不夠靈活,增加新的具體產品需要修改工廠類的判斷邏輯程式碼,而且產品較多時,工廠方法程式碼將會非常複雜。

  4. 在簡單工廠模式中,可以根據引數的不同返回不同類的例項。簡單工廠模式專門定義一個類來負責建立其他類的例項,被建立的例項通常都具有共同的父類。

  5. 簡單工廠模式包含三個角色:
    (1)工廠角色:負責實現建立所有例項的內部邏輯;
    (2)抽象產品角色:是所建立的所有物件的父類,負責描述所有例項所共有的公共介面;
    (3)具體產品角色:是建立目標,所有建立的物件都充當這個角色的某個具體類的例項。

  6. 簡單工廠模式的要點在於:當你需要什麼,只需要傳入一個正確的引數,就可以獲取你所需要的物件,而無須知道其建立細節。

  7. 簡單工廠模式適用情況包括:
    (1)工廠類負責建立的物件比較少;
    (2)客戶端只知道傳入工廠類的引數,對於如何建立物件不關心。