定義
工廠模式是我們最常用的實例化對象模式了,是用工廠方法代替new操作的一種模式。著名的Jive論壇 ,就大量使用了工廠模式,工廠模式在Java程序系統可以說是隨處可見。因為工廠模式就相當於創建實例對象的new,我們經常要根據類Class生成實例 對象,如A a=new A() 工廠模式也是用來創建實例對象的,所以以后new時就要多個心眼,是否可以考慮使用工廠模式,雖然這樣做,可能多做一些工作,但會給你系統帶來更大的可擴 展性和盡量少的修改量。
個人理解:工廠模式就等於生產產品,工廠模式實例化對象,當你需要實例化一個對象,你發現不止一個選擇(所有供選擇的類都實現了同一個接口)的時候,針對這一情況寫一個通用的方法(方法返回類型是那個共用的接口),這就是工廠模式了。
案例講解:以兩個工廠造車類和所有工廠操作類來實現工廠模式
寶馬類
public class Bmw implements Volkswagen { public static final int ID = 1; @Override public void drive() { // TODO Auto-generated method stub System.out.println("寶馬造車成功啦"); } @Override public String getName() { // TODO Auto-generated method stub return "寶馬"; } }
奔馳類
public class Benz implements Volkswagen { public static final int ID = 0; @Override public void drive() { // TODO Auto-generated method stub System.out.println("奔馳造車成功了"); } @Override public String getName() { // TODO Auto-generated method stub return "奔馳"; } }
Volkswagen.Java
/*** * 產品操作 * @author zq * */ public interface Volkswagen { void drive(); String getName(); }
工廠類
/*** * 工廠類 * @author zq * */ public class VehicleVolkswagenFactory { public Volkswagen createVolkswagen(int id) { Volkswagen volkswagen=null; switch (id) { case Benz.ID: volkswagen=new Benz(); break; case Bmw.ID: volkswagen=new Bmw(); break; default: break; } return volkswagen; } //反射得到 public Volkswagen createVolkswagen(Class <? extends Volkswagen> clazz){ Volkswagen volkswagen = null; try { volkswagen = clazz.newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } return volkswagen; } }
Activity.Java
public class VehicleActivity extends Activity { TextView tv_benz,tv_bmx; VehicleVolkswagenFactory factory; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.vehicle_activity); factory = new VehicleVolkswagenFactory(); initViewBenz(); initViewBmw(); } private void initViewBenz() { // TODO Auto-generated method stub tv_benz=(TextView) findViewById(R.id.tv_benz); Volkswagen volkswagen=factory.createVolkswagen(Benz.ID); tv_benz.setText(volkswagen.getName()); volkswagen.drive();//工廠相關方法 } private void initViewBmw() { // TODO Auto-generated method stub tv_bmx=(TextView) findViewById(R.id.tv_bmx); Volkswagen volkswagen=factory.createVolkswagen(Bmw.class); tv_bmx.setText("反射得到"+volkswagen.getName()); } }
優點
工廠類是整個模式的關鍵.包含了必要的邏輯判斷,根據外界給定 的信息,決定究竟應該創建哪個具體類的對象.通過使用工廠類,外界可以從直接創建具體產品對象的尷尬局面擺脫出來,僅僅需要負責“消費”對象就可以了。而 不必管這些對象究竟如何創建及如何組織的.明確了各自的職責和權利,有利於整個軟件體系結構的優化。
缺點
由於工廠類集中了所有實例的創建邏輯,違反了高內聚責任分配原則,將全部創建邏輯集中到了一個工廠類中;它所能創建的類只能是事先考慮到的,如果需要添加新的類,則就需要改變工廠類了。
當系統中的具體產品類不斷增多時候,可能會出現要求工廠類根據不同條件創建不同實例的需求.這種對條件的判斷和對具體產品類型的判斷交錯在一起,很難避免模塊功能的蔓延,對系統的維護和擴展非常不利;