工廠(Factory)模式本質上就是封裝對象的建立。編程
工廠模式大體分爲:簡單工廠、靜態工廠、工廠方法、抽象工廠模式。設計模式
嚴格意義上來講,簡單工廠和靜態工廠並非一種設計模式,反而比較像一種編程習慣。但因爲常常被使用,因此不少開發人員把這個編程習慣認爲是「工廠模式」。ide
1.簡單工廠ui
1.1 簡單工廠角色spa
public class PizzaFactory { public static final String CHEESE_PIZZA = "Cheese"; public static final String GREEK_PIZZA = "Greek"; public Pizza createPizza(String type){ if(CHEESE_PIZZA.equals(type)){ return new CheesePizza(); }else if(GREEK_PIZZA.equals(type)){ return new GreekPizza(); } return null; } }
1.2 Dome設計
public class PizzaDemo { public static void main(String[] args) { PizzaFactory factory = new PizzaFactory(); factory.createPizza(PizzaFactory.CHEESE_PIZZA); } }
【每一次建立建立PizzaFactory對象都是爲了調用createPizza(),所以能夠採用靜態方法的方式,減小對PizzaFactory對象的建立。此模式被稱爲靜態工廠模式】3d
2. 靜態工廠模式code
2.1 靜態工廠角色對象
public class PizzaFactory { public static final String CHEESE_PIZZA = "Cheese"; public static final String GREEK_PIZZA = "Greek"; public static Pizza createPizza(String type){ if(CHEESE_PIZZA.equals(type)){ return new CheesePizza(); }else if(GREEK_PIZZA.equals(type)){ return new GreekPizza(); } return null; } }
2.2 Demoblog
public class PizzaDemo { public static void main(String[] args) { PizzaFactory.createPizza(PizzaFactory.CHEESE_PIZZA); } }
【每添加一種新的品種,都須要對工廠類進行修改,這違背了設計模式中的開放-封閉原則(對擴展開放,對修改封閉),所以有了工廠方法】
3. 工廠方法
針對一個產品,經過繼承的方式,讓子類建立對象。若是須要添加新的品種,只須要建立新的子類。
3.1 超類
public abstract class PizzaStore { public abstract Pizza createPizza(); public Pizza orderPizza(){ // let sub-class decide to which pizza will be created. Pizza pizza = createPizza(); pizza.make(); pizza.bake(); pizza.cut(); pizza.box(); return pizza; } }
3.2 子類
public class CheesePizzaStore extends PizzaStore { @Override public Pizza createPizza(){ return new CheesePizza(); } }
3.3 Demo
public class PizzaDemo { public static void main(String[] args) { PizzaStore store = new CheesePizzaStore(); store.orderPizza(); } }
【當須要建立多個產品(即:產品族)的時候,工廠方法已經沒法知足需求。針對這種狀況,產生了抽象工廠模式】
4. 抽象工廠模式
抽象工廠針對的是一個產品族,經過組合的方式建立對象。
4.1 抽象工廠角色【聲明產品】
//Two product: Apple & Banana
public interface FruitFactory { public Fruit getApple(); public Fruit getBanana(); }
4.2 具體的工廠角色【實例化某個產品族族中的全部產品】
public class NorthFruitFactory implements FruitFactory { @Override public Fruit getApple() { return new NorthApple(); } @Override public Fruit getBanana() { return new NorthBanana(); } }
public class SouthFruitFactory implements FruitFactory { @Override public Fruit getApple() { return new SouthApple(); } @Override public Fruit getBanana() { return new SouthBanana(); } }
4.3 Dome
public class Demo { public static void main(String[] args) { FruitFactory factory = new NorthFruitFactory(); factory.getApple(); factory.getBanana(); System.out.println("---------------------------"); factory = new SouthFruitFactory(); factory.getApple(); factory.getBanana(); } }
4.4 備註
當須要添加一個新的產品,就必須修改接口,而且須要修改每一個接口的實現。
5.參考資料
5.1 O'Reilly《Head First設計模式》
5.2 北風網在線培訓《策略模式》