原創文章,轉載請標註出處:Java設計模式之《工廠方法模式》及使用場景html
工廠,就是生產產品的地方。java
在Java設計模式中使用工廠的概念,那就是生成對象的地方了。設計模式
原本直接就能建立的對象爲什麼要增長一個工廠類呢?ide
這就須要瞭解工廠方法要解決的是什麼問題了,若是隻有一個類,咱們直接new一個對象完事,這是最簡單的;可是若是有多個類呢,並且這些類還須要針對不一樣的狀況來建立不一樣的對象,這時候就須要工廠了,咱們能夠在工廠中根據條件來建立具體的對象。測試
這樣一來就將調用方和具體的目標類進行了解耦,調用方根本就不知道須要建立那個對象,它只是提出了條件,而後工廠就能夠根據給定的條件來決定建立哪個對象。spa
要說工廠方法模式,不得不先了解下簡單工程方法模式,這個模式並非23種設計模式中的內容。設計
所謂簡單工廠方法模式,就是爲目標類建立一個工廠,當有多個目標實現的時候,在這個工廠內部進行邏輯判斷來根據條件建立不一樣的目標實例。代理
下面看個例子,我就以桌子爲例來寫:code
桌子接口:Deskhtm
/** * 桌子接口 */ public interface Desk { String getType(); }
木質桌子:WoodenDesk
/** * 木質桌子 */ public class WoodenDesk implements Desk{ private String type = "木質桌"; @Override public String getType() { return type; } }
塑料桌子:PlasticDesk
/** * 塑料桌 */ public class PlasticDesk implements Desk { private String type = "塑料桌"; @Override public String getType() { return type; } }
類型枚舉:Type
/** * 類型 */ public enum Type { PLASTIC,WOODEN; }
桌子工廠:DeskFactory
/** * 桌子工廠 */ public class DeskFactory { public static Desk createDesk(Type type) { switch (type) { case WOODEN: return new WoodenDesk(); case PLASTIC: return new PlasticDesk(); default: return null; } } }
測試類:Clienter
/** * 測試類 */ public class Clineter { public static void main(String[] args) { Desk desk = DeskFactory.createDesk(Type.PLASTIC); System.out.println(desk.getType()); } }
執行結果
塑料桌
這就是簡單工廠方法,只有一個工廠類來面向多個目標實現。當目標實現增多時,咱們不得不去修改工廠類的方法,使其兼容新的實現類型,這明顯違背了開閉原則,因此出現了工廠方法模式。
工廠方法模式是對簡單工廠模式的抽象升級,將工廠這個概念抽象出來成爲接口,而後針對每種目標實現類建立一個工廠實現,一對一來實現,當新增了目標實現,只要同時新增一個工廠實現便可。
下面看看實例:
桌子接口:Desk
/** * 桌子接口 */ public interface Desk { String getType(); }
木質桌子:WoodenDesk
/** * 木質桌子 */ public class WoodenDesk implements Desk{ private String type = "木質桌"; @Override public String getType() { return type; } }
塑料桌子:PlasticDesk
/** * 塑料桌 */ public class PlasticDesk implements Desk { private String type = "塑料桌"; @Override public String getType() { return type; } }
桌子工廠接口:DeskFactory
/** * 桌子工廠接口 */ public interface DeskFactory { Desk createDesk(); }
木質桌子工廠:WoodenDeskFactory
/** * 木質桌子工廠 */ public class WoodenDeskFactory implements DeskFactory{ @Override public Desk createDesk(){ return new WoodenDesk(); } }
塑料桌子工廠:
/** * 塑料桌子工廠 */ public class PlasticDeskFactory implements DeskFactory { @Override public Desk createDesk() { return new PlasticDesk(); } }
測試類:Clienter
/** * 測試類 */ public class Clienter { public static void main(String[] args) { DeskFactory factory = new WoodenDeskFactory(); Desk desk = factory.createDesk(); System.out.println(desk.getType()); } }
執行結果:
木質桌
從上面的實例中能夠很容易看出來,工廠方法模式的重點就在這個工廠接口了。
目標能夠無限擴展,工廠類也要隨之擴展,一對一存在,知足了開閉原則,但若是目標實現較多,工廠實現類也會增多,不簡潔。
MyBatis中使用的比較多,事務模塊和數據源模塊都使用了工廠方法模式。
同系列文章:
原文出處:https://www.cnblogs.com/V1haoge/p/10491982.html