1、簡單工廠模式簡介java
在面向對象編程中, 最一般的方法是一個new操做符產生一個對象實例,new操做符就是用來構造對象實例的。可是在一些狀況下, new操做符直接生成對象會帶來一些問題。舉例來講, 許多類型對象的創造須要一系列的步驟: 你可能須要計算或取得對象的初始設置; 選擇生成哪一個子對象實例; 或在生成你須要的對象以前必須先生成一些輔助功能的對象。 這個時候使用簡單工廠方法模式就能夠隱藏這些對象new的過程。編程
好比你如今要買一輛寶馬,這個時候你只須要將你的購車信息提供給寶馬工廠,寶馬工廠就會爲你建立一輛你須要的寶馬,若是你不經過工廠去建立除非你可以本身製造一輛。下面就經過這個例子給你們講講簡單工廠模式。設計模式
首先你須要提供一個抽象的寶馬產品,可能有不少型號,好比寶馬X3,寶馬320i等等,只須要繼承改抽象類便可ide
public abstract class Bmw { public Bmw(){} }
接下來具體的寶馬車的型號,工廠就是專門生產這些產品的,下面是寶馬320i,X5型號的寶馬,固然還會有很是多的產品,直接繼承寶馬抽象類Bmw便可測試
public class Bmw320i extends Bmw{ public Bmw320i(){ System.out.println("生產了一輛BMW320i"); } } public class BmwX5 extends Bmw{ public BmwX5(){ System.out.println("生產了一輛BMWX5"); } }
接下來是生產寶馬各種產品的工廠類spa
public class BmwFactory { public Bmw createBmw(String type){ switch (type) { case "320i": return new Bmw320i(); case "X5": return new BmwX5(); default: System.out.println("沒有"); return null; } } }
客戶端代碼設計
public class Show { public static void main(String[] args) { BmwFactory bmwFactory = new BmwFactory(); Bmw bmwX5 = bmwFactory.createBmw("X5"); Bmw bmw320i = bmwFactory.createBmw("320i"); } }
測試結果code
生產了一輛BMWX5
生產了一輛BMW320i
很明顯客戶端並無new寶馬產品對象的過程,這就是簡單工廠模式的做用,它隱藏了對象的具體建立過程。可是這樣的模式是有缺陷的,當我如今須要添加寶馬X7,這個時候只能經過修改工廠類BmwFactory的源代碼添加一條X5的判斷,這嚴重違反了設計模式的開發-封閉原則,工廠類對於擴展是開放的,可是源碼是不準修改的,關於設計模式的六大原則筆者會在後續博客中詳述。既然違反了這個原則,確定是有解決辦法的,下面爲你們帶來工廠方法模式。對象
工廠方法模式就很好的解決了上面遇到的問題。簡單工廠模式只有一個工廠類,全部的產品的建立都依賴這一個工廠類,須要添加新產品也是直接修改工廠類,這樣既增長了工廠類的負擔,也違反了開-閉原則。而工廠方法模式提供了一個抽象的工廠類,一個抽象的產品類,抽象工廠類有不少的具體的產品工廠建立類,每一個抽象的產品類有不少子類產品。也就是說簡單工廠模式就是全部的產品都在一個工廠類裏面生產,而抽象方法模式是一個工廠生產一個產品,工廠類的負擔不同。blog
代碼以下:
Bmw抽象類,產品的抽象類
public abstract class Bmw { public Bmw(){} }
Bmw320i類,BmwX5類,具體的寶馬產品類,繼承了抽象類Bmw
public class Bmw320i extends Bmw{ public Bmw320i(){ System.out.println("生產了一輛BMW320i"); } } public class BmwX5 extends Bmw{ public BmwX5(){ System.out.println("生產了一輛BMWX5"); } }
FactoryBMW類,抽象工廠類,各類產品的建立工廠都須要繼承這個抽象類,返回不一樣的產品
public abstract class FactoryBMW { public abstract Bmw createBMW(); }
FactoryBMW320i類,FactoryBMWX5類,具體的工廠類,每個工廠類生產這一種產品,這是與簡單工廠模式的不一樣
public class FactoryBMW320i extends FactoryBMW { @Override public Bmw createBMW() { return new Bmw320i(); } } public class FactoryBMWX5 extends FactoryBMW { @Override public Bmw createBMW() { return new BmwX5(); } }
客戶端代碼
public class Show { public static void main(String[] args) { //這裏須要那種產品就獲取那種產品工廠 FactoryBMW320i factoryBMW320i = new FactoryBMW320i(); FactoryBMWX5 factoryBMWX5 = new FactoryBMWX5(); factoryBMW320i.createBMW(); factoryBMWX5.createBMW(); } }
測試結果
生產了一輛BMW320i
生產了一輛BMWX5
能夠看到和簡單工廠模式的結果是一致的。
首先看看簡單工廠模式的UML圖
接下來是工廠方法模式UML圖
對比兩種UML就很容易理解兩種模式的區別了。
簡單工廠模式又稱靜態工廠方法模式。重命名上就能夠看出這個模式必定很簡單。它存在的目的很簡單:定義一個用於建立對象的接口。 他的結構以下
1) 工廠類角色:這是本模式的核心,含有必定的商業邏輯和判斷邏輯。
2) 抽象產品角色:它通常是具體產品繼承的父類或者實現的接口。
3) 具體產品角色:工廠類所建立的對象就是此角色的實例。在java中由一個具體類實現。
工廠方法模式去掉了簡單工廠模式中工廠方法的靜態屬性,使得它能夠被子類繼承。這樣在簡單工廠模式裏集中在工廠方法上的壓力能夠由工廠方法模式裏不一樣的工廠子類來分擔。 他的結構以下 1)抽象工廠角色: 這是工廠方法模式的核心,它與應用程序無關。是具體工廠角色必須實現的接口或者必須繼承的父類。在java中它由抽象類或者接口來實現。 2)具體工廠角色:它含有和具體業務邏輯有關的代碼。由應用程序調用以建立對應的具體產品的對象。 3)抽象產品角色:它是具體產品繼承的父類或者是實現的接口。在java中通常有抽象類或者接口來實現。 4)具體產品角色:具體工廠角色所建立的對象就是此角色的實例。在java中由具體的類來實現。