Java中设计模式之工厂模式-4
一、工廠模式由來
1)還沒有工廠時代:假如還沒有工業革命,如果一個客戶要一款寶馬車,一般的做法是客戶去創建一款寶馬車,然后拿來用。
2)簡單工廠模式:后來出現工業革命。用戶不用去創建寶馬車。因為客戶有一個工廠來幫他創建寶馬.想要什么車,這個工廠就可以建。比如想要320i系列車。工廠就創建這個系列的車。即工廠可以創建產品。
3)工廠方法模式時代:為了滿足客戶,寶馬車系列越來越多,如320i,523i,30li等系列一個工廠無法創建所有的寶馬系列。于是由單獨分出來多個具體的工廠。每個具體工廠創建一種系列。即具體工廠類只能創建一個具體產品。但是寶馬工廠還是個抽象。你需要指定某個具體的工廠才能生產車出來。
4)抽象工廠模式時代:隨著客戶的要求越來越高,寶馬車必須配置空調。于是這個工廠開始生產寶馬車和需要的空調。
最終是客戶只要對寶馬的銷售員說:我要523i空調車,銷售員就直接給他523i空調車了。而不用自己去創建523i空調車寶馬車.
這就是工廠模式。
工廠模式組成解析
簡化——>兩個大類:工廠類+產品類
分解——>工廠類:子類工廠,每個工廠生產不同的產品
分解——>產品類:子類產品,多個同類產品為一族,可以存在多個族(如衣服族,鞋子族)
二、工廠模式分類
工廠模式可以分為三類:
1)簡單工廠模式(Simple Factory) :不利于產生系列產品
2)工廠方法模式(Factory Method) :又稱為多形性工廠
3)抽象工廠模式(Abstract Factory): 又稱為工具箱,產生產品族,但不利于產生新的產品
這三種模式從上到下逐步抽象,并且更具一般性。
1.簡單工廠和工廠方法模式的比較
工廠方法模式和簡單工廠模式在定義上的不同是很明顯的。工廠方法模式的核心是一個抽象工廠類,而不像簡單工廠模式, 把核心放在一個實類上。工廠方法模式可以允許很多實的工廠類從抽象工廠類繼承下來, 從而可以在實際上成為多個簡單工廠模式的綜合,從而推廣了簡單工廠模式。
反過來講,簡單工廠模式是由工廠方法模式退化而來。設想如果我們非常確定一個系統只需要一個實的工廠類, 那么就不妨把抽象工廠類合并到實的工廠類中去。而這樣一來,我們就退化到簡單工廠模式了。
2.工廠方法模式和抽象工廠模式區別
工廠方法模式:
一個抽象產品類,可以派生出多個具體產品類。
一個抽象工廠類,可以派生出多個具體工廠類。
每個具體工廠類只能創建一個具體產品類的實例。
抽象工廠模式:
多個抽象產品類,每個抽象產品類可以派生出多個具體產品類。
一個抽象工廠類,可以派生出多個具體工廠類。
每個具體工廠類可以創建多個具體產品類的實例。
區別:
工廠方法模式只有一個抽象產品類,而抽象工廠模式有多個。
工廠方法模式的具體工廠類只能創建一個具體產品類的實例,而抽象工廠模式可以創建多個。
兩者皆可。
三、簡單工廠模式
簡單工廠模式又稱靜態工廠方法模式。
角色組成:
TCB一句話:具體工廠類+產品抽象類+產品具體類(三個類)
1) 工廠類角色:這是本模式的核心,含有一定的商業邏輯和判斷邏輯。在java中它往往由一個具體類實現。
2) 抽象產品角色:它一般是具體產品繼承的父類或者實現的接口。在java中由接口或者抽象類來實現。
3) 具體產品角色:工廠類所創建的對象就是此角色的實例。在java中由一個具體類實現。
實例:
工廠
package Factory;public class Factory {public static YiFu getYiFu(String name){if(name.equals("上衣")){return new ShangYi();}else if(name.equals("褲子")){return new KuZi();}return null;} }抽象產品
package Factory;public class YiFu {public void makeClothes(); }具體產品類:
褲子
上衣
package Factory;public class ShangYi extends YiFu {@Overridepublic void makeClothes(){System.out.println("上衣");} }測試類
package Factory;public class Test {public static void main(String[] args){YiFu ku=Factory.getYiFu("褲子");ku.makeClothes();YiFu shang=Factory.getYiFu("上衣");shang.makeClothes();} }借鑒實例:客戶自己創建寶馬車,然后拿來用。
四、工廠方法模式(僅一個產品族)
工廠方法模式是簡單工廠模式的進一步抽象化和推廣,工廠方法模式里不再只由一個工廠類決定那一個產品類應當被實例化,這個決定被交給抽象工廠的子類去做。
角色組成
TCB一句話:(抽象工廠+具體工廠)+(抽象產品+具體產品類)【四個類】
1)抽象工廠角色:這是工廠方法模式的核心,它與應用程序無關。是具體工廠角色必須實現的接口或者必須繼承的父類。在java中它由抽象類或者接口來實現。2)具體工廠角色:它含有和具體業務邏輯有關的代碼。由應用程序調用以創建對應的具體產品的對象。3)抽象產品角色:它是具體產品繼承的父類或者是實現的接口。在java中一般有抽象類或者接口來實現。4)具體產品角色:具體工廠角色所創建的對象就是此角色的實例。在java中由具體的類來實現。工廠方法模式使用繼承自抽象工廠角色的多個子類來代替簡單工廠模式中的“上帝類”。
實例
//抽象產品角色
//抽象產品角色 public interface Moveable {void run(); } //具體產品角色 public class Plane implements Moveable {@Overridepublic void run() {System.out.println("plane....");} }public class Broom implements Moveable {@Overridepublic void run() {System.out.println("broom.....");} }//抽象工廠 public abstract class VehicleFactory {abstract Moveable create(); } //具體工廠 public class PlaneFactory extends VehicleFactory{public Moveable create() {return new Plane();} } public class BroomFactory extends VehicleFactory{public Moveable create() {return new Broom();} } //測試類 public class Test {public static void main(String[] args) {VehicleFactory factory = new BroomFactory();Moveable m = factory.create();m.run();} }五、抽象工廠模式(多個產品族)
角色組成
TCB一句話:(抽象工廠+具體工廠)+(多個抽象產品類+對應具體產品類)【至少六個類】
實例
//抽象工廠類 public abstract class AbstractFactory {public abstract Vehicle createVehicle();public abstract Weapon createWeapon();public abstract Food createFood(); } //具體工廠類,其中Food,Vehicle,Weapon是抽象類, public class DefaultFactory extends AbstractFactory{@Overridepublic Food createFood() {return new Apple();}@Overridepublic Vehicle createVehicle() {return new Car();}@Overridepublic Weapon createWeapon() {return new AK47();} } //測試類 public class Test {public static void main(String[] args) {AbstractFactory f = new DefaultFactory();Vehicle v = f.createVehicle();v.run();Weapon w = f.createWeapon();w.shoot();Food a = f.createFood();a.printName();} }在抽象工廠模式中,抽象產品 (AbstractProduct) 可能是一個或多個,從而構成一個或多個產品族(Product Family)。 在只有一個產品族的情況下,抽象工廠模式實際上退化到工廠方法模式。
總結
以上是生活随笔為你收集整理的Java中设计模式之工厂模式-4的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java中设计模式之生产者消费者模式-3
- 下一篇: Java常用类之【八种基本数据类型】