徹底明白Android設計模式—工廠方法模式

封裝類中變化的部分,提取其中個性化善變的部分爲獨立類,通過依賴注入以達到解耦、複用和方便後期維護拓展的目的

ok,還是舉個🌰,
既然是工廠模式,就打比方有一個工廠生產產品,首先要一個抽象產品類,描述產品的公共方法,以及兩個具體的產品(手機產品和電視產品):

/**
     * 抽象產品類,所有產品的抽象父類,描述公共的方法部分
     */
    public abstract class Product {
        public abstract void dosomething();
    }

    /**
     * 具體產品類,所有產品的抽象父類,描述公共的方法部分
     * 這裏比如想生產 手機產品,電視產品
     */
    public class PhoneProduct extends Product {

        @Override
        public void dosomething() {
            //具體事情實現,比如這裏生產cpu,屏幕,攝像頭等製作手機
        }
    }

    public class TvProduct extends Product {

        @Override
        public void dosomething() {
            //具體事情實現,比如這裏生產電視屏幕,遙控器等
        }
    }

再把工廠的製造產品方法抽象出來,實現具體工廠類

 /**
     * 抽象工廠類,生產一個泛型的產品對象
     */
    public abstract class Factory {
        public abstract Product createProduct(Class<? extends Product> c);
    }


    /**
     * 具體工廠類,所有產品從這裏生產,可以返回具體的產品對象
     */
    public class RealFactory extends Factory {

        public Product createProduct(Class<? extends Product> c) {
            Product product = null;
            try {
                product = (Product) Class.forName(c.getName()).newInstance();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return product;
        }
    }

ok,所有工作就緒,一套工廠系統完成,接下來就可以讓工廠建造出不同的產品,而且需要新產品只需要實現Product接口即可,實現解耦

    public void main() {
        Factory factory = new RealFactory();
        Product product=factory.createProduct(PhoneProduct.class);
        product.dosomething();

    }

在Android中的應用

說個比較常見的需求吧,比如老闆讓你設計app中的支付功能,支付方式有很多,以後也有可能添加支付方式。
這時候就可以把支付方式抽象出來,用一個工廠類統一管理,用於返回具體的支付方式類。這樣支付的時候,調用工廠類的方法,把具體支付方式傳給工廠就可以了。

簡單寫下代碼:

public abstract class PayChannel {
        public abstract void doInit();

        public abstract void doPay();
    }

    public abstract class PayFactory {
        public abstract Product createProduct(Class<? extends PayChannel> c);
    }

    public class PayFactory extends PayFactory {

        public PayChannel createProduct(Class<? extends PayChannel> c) {
            //這裏可以做一些統一的操作,比如記錄數據等
            PayChannel payChannel = null;
            try {
                payChannel = (PayChannel) Class.forName(c.getName()).newInstance();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return payChannel;
        }
    }

    public void main() {
        PayFactory payFactory = new PayFactory();
        PayChannel channel = payFactory.createProduct(WeixinPay.class);
        channel.doInit();
        channel.doPay();
    }

其實我想過爲什麼非要通過工廠這一層呢?直接通過抽象類的實現類執行方法不行嗎?後面我想了下,我的理解是工廠類可以統一管理,並且做一些統一操作,就跟實際的工廠可以統一管理機器生產產品一樣。

如果有說的不對的地方可以一起討論下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章