Android開發設計模式之——原廠模式

來源:互聯網
上載者:User

在android中用到了很多的工廠類,如ThreadFactory建立抽象Runnable 。下面通過簡單的例子來學習原廠模式。 一、作用

原廠模式(Factory Method):定義一個用於建立對象的介面,讓子類決定將哪一個類執行個體化。從而使一個類的執行個體化延遲到其子類。

抽象原廠模式(Abstract Factory):提供一個建立一系列相關或相互依賴對象的介面,而無需指定它們具體的類。

二、使用情境

1. 對同一個介面的實作類別進行管理和執行個體化建立

三、常用的使用方式

講例子之前,先假設要做這樣的一個設計。設計一個Usb功能的介面,具有store(儲存)和takeAlong(攜帶方便)兩個行為。然後要設計兩個產品,一個是 Phone(手機),另一個是Camera(照相機),很顯然,它們都可以是 Usb的實作類別。為了便於統一管理和建立,我們很容易就能設計出一個簡單的原廠模式。

(1)普通的Factory 方法

首先,我們可以畫出相關的設計圖:


代碼實現如下:

定義Usb介面

public interface Usb {    void store();    void takeAlong();}
Phone類

public class Phone implements Usb {    @Override    public void store() {        System.out.println("this is Phone usb!");    }    @Override    public void takeAlong() {        // TODO Auto-generated method stub    }    public void call() {        //TODO    }    public void sms() {        //TODO    }}
Camera類

public class Camera implements Usb {    @Override    public void store() {        System.out.println("this is Camera usb!");    }    @Override    public void takeAlong() {        // TODO Auto-generated method stub    }    public void takePhotos() {        //TODO    }}
建立一個簡單的工廠類UsbFactory1,負責生產
/** * 普通Factory 方法 * 參數傳遞的字串會出錯 * :正確建立對象 *  * @author xuzhaohu *  */public class UsbFactory1 {    public Usb produce(String type) {        if ("phone".equals(type)) {            return new Phone();        } else if ("camera".equals(type)) {            return new Camera();        } else {            System.out.println("請輸入正確的類型!");            return null;        }    }}
子類執行個體化通過工廠類去建立,如要建立camera,
        /*普通Factory 方法**/        UsbFactory1 factory1 = new UsbFactory1();        Usb usb1 = factory1.produce("camera");//+phone        usb1.store();
輸出:this is Camera usb!

總結:實現了原廠模式的準系統,但是需要傳參去控制,會出現很多不確定的問題,可以在工廠類中定義不同產品的生產,就是如下介紹的工廠多方法生產。

(2)工廠多方法

只要在UsbFactory中再定製一下就行,業務更加分明

根據設計修改工廠類

** * 多個工廠類方法 *  * @author xuzhaohu *  */public class UsbFactory2 {    public Usb producePhone() {        return new Phone();    }    public Usb produceCamera() {        return new Camera();    }}
同樣,要執行個體化某個子類對象,則可以這樣去調用:
/*多個Factory 方法模式**/        UsbFactory2 factory2 = new UsbFactory2();        Usb usb2 = factory2.producePhone();//+camera        usb2.store();

輸出:this is Phone usb!

這樣是不是讓商務邏輯更加清晰了一些呢。

但是如果在多處都要調用生產的話,不能每次都通過執行個體化工廠類然後去生產吧,這時候可以怎麼樣呢。

對,可以通過類訪問,在工廠類中加上static方法。

/** * 靜態Factory 方法 * :不需要執行個體 *  * @author xuzhaohu *  */public class UsbFactory3 {    public static Phone producePhone() {        return new Phone();    }    public static Camera produceCamera() {        return new Camera();    }}
那麼這時候可以直接不用執行個體化工廠類去訪問了
        /*靜態Factory 方法模式**/        Usb usb3 = UsbFactory3.producePhone();//+camera        usb3.store();

輸出:this is Phone usb!

這樣就更加方便了一些。一般情況下,這樣就基本能滿足需求了,但是如果現在需求又要增加生產另外一個實作類別產品Phone1,這時候肯定需要修改工廠類,在工廠類中增加一個新類型的生產Phone1方法。從設計的角度上講,可能違背了 閉包(對擴充要開放對修改要關閉) 的設計原則,為了不違背這個原則,可以抽象Factory 方法去設計,下面將講到。

(3)抽象的Factory 方法

為了不修改工廠中方法,我們可以對每個產品都建立相應工廠類去實現生產。這時候可以通過一個介面 Provider 去定義生產(produce)這個行為,然後讓每個產品的工廠類都實現這個介面。這樣如果有新的產品要生產的話只需要先實現一個工廠類就行。如下設計

生產介面Provider

/** * 將工廠生產的行為寫成介面獨立 *  * @author xuzhaohu *  */public interface Provider {    Usb produce();}
每個產品都有自己的工廠

PhoneFactory工廠

public class PhoneFactory implements Provider {    @Override    public Usb produce() {        // TODO Auto-generated method stub        return new Phone();    }}
CameraFactory工廠
public class CameraFactory implements Provider {    @Override    public Usb produce() {        // TODO Auto-generated method stub        return new Camera();    }}
每一個產品可以根據自己的業務來去工廠生產產品,如要生產Camera
       /*抽象Factory 方法模式**/        /*1.擴充性好,不用修改原始碼         *2.添加一個實現USB介面的類+一個對應的實現Provider的工廠類**/        Provider provider = new CameraFactory();        Usb usb4 = provider.produce();        usb4.store();
輸出:this is Camera usb!

總結:抽象原廠模式從軟體設計模式的原則上講還是值得去推薦的。


參考:http://zz563143188.iteye.com/blog/1847029

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.