Android設計模式之工廠模式


定義

工廠模式是我們最常用的實例化對象模式了,是用工廠方法代替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());
        
    }
    
}

優點
工廠類是整個模式的關鍵.包含了必要的邏輯判斷,根據外界給定 的信息,決定究竟應該創建哪個具體類的對象.通過使用工廠類,外界可以從直接創建具體產品對象的尷尬局面擺脫出來,僅僅需要負責“消費”對象就可以了。而 不必管這些對象究竟如何創建及如何組織的.明確了各自的職責和權利,有利於整個軟件體系結構的優化。


缺點
由於工廠類集中了所有實例的創建邏輯,違反了高內聚責任分配原則,將全部創建邏輯集中到了一個工廠類中;它所能創建的類只能是事先考慮到的,如果需要添加新的類,則就需要改變工廠類了。
當系統中的具體產品類不斷增多時候,可能會出現要求工廠類根據不同條件創建不同實例的需求.這種對條件的判斷和對具體產品類型的判斷交錯在一起,很難避免模塊功能的蔓延,對系統的維護和擴展非常不利;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM