前言:
看了網絡上很多關於設計模式的方法,有的模式看起來相似,但本質還是區別很大的.像簡單工廠,工廠方法和抽象工廠就有很明顯的區別.
有一個比較好理解的例子,在這跟大家介紹下:
1.如果一個后花園只種蔬菜類,那么就用簡單工廠就可以了.
2.如果后花園蔬菜品種繁多.得用工廠方法才可以,把共有的東西抽象出來.
3.如果要擴大后花園的規模,比如一個在北方,一個在南方,這樣工廠方法就無法實現了,就應當用抽象工廠,把各種各樣的植物,又組成一個后花園.
所以我個人認為,簡單工廠是一個工廠只生產一類的產品,面對的是具體的類,工廠方法是可以生產不同的產品,把公共的方法抽象出來,然后進行創建各種各樣的產品.抽象工廠把幾種產品划出共同的東西,把相互依賴的對象抽象出來,只要實現這些接口就可以得到不同的產品.
1、工廠方法模式(Factory Method)
1.1、普通工廠模式(靜態工廠),就是建立一個工廠類,對實現了同一接口的一些類根據用戶需求進行實例的創建。首先看下關系圖:
概念這些比較繞,直接舉例吧!(我們舉個手機工廠的例子)
第一步:創建一個手機接口,定義一個生產手機的公共方法;
public interface MobilePhone { public void production (); }
第二步:創建具體實現類
public class HuaWei implements MobilePhone{ public void production() { // TODO Auto-generated method stub System.out.println("華為手機生產"); } } public class Vivo implements MobilePhone{ public void production() { System.out.println("vivo手機生產"); } }
第三步:創建工廠類
public class MobilePhoneFactory { public MobilePhone produceFactory(String name){ if ("HuaWei".equals(name)) { return new HuaWei(); } else if ("Vivo".equals(name)) { return new Vivo(); } else { System.out.println("請輸入正確的類型!"); return null; } } }
最后測試一下
public class Test { public static void main(String[] args) { MobilePhoneFactory m=new MobilePhoneFactory(); MobilePhone mobilePhone=m.produceFactory("Vivo"); mobilePhone.production(); } }
輸出:vivo手機生產
總結:簡單工廠相當於一個模子,根據傳入的參數通過一些自己的邏輯判斷;生產出不同類型的相應的產品、對象。但這種模式局限性很大,一但參數錯誤,就不能做出正確的操作,而且新增一些產品就要更改工廠類;所以這種模式一般用於比較簡單的場景;
1.2、多個工廠方法模式
多個工廠方法模式是對普通工廠方法模式的改進,在普通工廠方法模式中,如果傳遞的字符串出錯,則不能正確創建對象,而且新增一些產品就要更改工廠類;而多個工廠方法模式是提供多個工廠方法,分別創建對象。
只要將上面的工廠做下修改即可;如下:
public abstract class Factory { public abstract MobilePhone getMobilePhone(); } public class HuaWeiFactory extends Factory{ @Override public MobilePhone getMobilePhone() { // TODO Auto-generated method stub return new HuaWei(); } } public class VivoFactory extends Factory{ @Override public MobilePhone getMobilePhone() { // TODO Auto-generated method stub return new Vivo(); } }
測試如下:
public class Test {
public static void main(String[] args) {
Factory m=new HuaWeiFactory();
MobilePhone mobilePhone=m.getMobilePhone();
mobilePhone.production();
}
}
輸出:華為手機生產
2:抽象工廠
為創建一組相關或相互依賴的對象提供一個接口,而且無需指定他們的具體類;如下圖:
還是用手機的例子,但現在生產手機的同時還要生產配套的充電器;增加代碼如下:
public interface MobilepHoneAccessories { public void production (); } public class VivoTheCharger implements MobilepHoneAccessories{ public void production() { // TODO Auto-generated method stub System.out.println("vivo充電器生產"); } } public class HuaWeiTheCharger implements MobilepHoneAccessories{ public void production() { System.out.println("華為充電器生產"); } }
工廠修改如下:
public abstract class Factory { //手機生產 public abstract MobilePhone getMobilePhone(); //充電器生產 public abstract MobilepHoneAccessories getThrCharger(); } public class HuaWeiFactory extends Factory{ @Override public MobilePhone getMobilePhone() { // TODO Auto-generated method stub return new HuaWei(); } @Override public MobilepHoneAccessories getThrCharger() { // TODO Auto-generated method stub return new HuaWeiTheCharger(); } } public class VivoFactory extends Factory{ @Override public MobilePhone getMobilePhone() { // TODO Auto-generated method stub return new Vivo(); } @Override public MobilepHoneAccessories getThrCharger() { // TODO Auto-generated method stub return new VivoTheCharger(); } }
測試如下:
public class Test { public static void main(String[] args) { Factory m=new HuaWeiFactory(); MobilePhone mobilePhone=m.getMobilePhone(); MobilepHoneAccessories mha=m.getThrCharger(); mobilePhone.production(); mha.production(); } }
輸出:華為手機生產
華為充電器生產
總結:
簡單工廠 : 用來生產同一等級結構中的任意產品。(對於增加新的產品,無能為力)
工廠方法 :用來生產同一等級結構中的固定產品。(支持增加任意產品)
抽象工廠 :用來生產不同產品族的全部產品。(對於增加新的產品,無能為力;支持增加產品族)