android設(shè)計模式之工廠模式

簡介:

工廠模式是創(chuàng)建型設(shè)計模式的一種,它使用戶不必關(guān)心具體產(chǎn)品的生產(chǎn),直接獲取想要的結(jié)果。工廠模式包括:簡單工廠模式,工廠方法模式,抽象工廠模式;對應(yīng)難度,初級、中級、高級三個不同的難度等級。而常說的工廠模式,通常是指代工廠方法模式。
參考連接

初級:簡單工廠模式

以下創(chuàng)建一個簡單的表格顯示實例,來理解簡單工廠模式;

普通實現(xiàn):

方式一:

/**
 * Created by zhangxuehui on 2017/6/9.
 * 普通模式,實現(xiàn)圖表
 */
public class ChartSimple {
    public static void main(String[] args) {
        //具體使用
        new LineChart().showChart();
        new PieChart().showChart();
        new ClumnChart().showChart();
    }

    /**
     * 線性圖類
     */
    public static class LineChart {
        public LineChart() {
            System.out.println("初始化線型圖");
        }

        public void showChart() {
            System.out.println("顯示線型圖");
        }
    }

    /**
     * 餅狀圖類
     */
    public static class PieChart {
        public PieChart() {
            System.out.println("初始化餅狀圖");
        }

        public void showChart() {
            System.out.println("顯示餅狀圖");
        }
    }

    /**
     * 柱形圖類
     */
    public static class ClumnChart {
        public ClumnChart() {
            System.out.println("初始化柱形圖");
        }

        public void showChart() {
            System.out.println("顯示柱形圖");
        }
    }
}

問題
1.使用那種圖表就要創(chuàng)建具體的圖表實例;
2.代碼冗余,會產(chǎn)生大量重復(fù)代碼;
3.不便于維護(hù),如改變所有圖表的顏色;
4.需要對每一個圖表類進(jìn)行充分的理解;

方式二:

public class ChartUtils {
    private int type;
    private String data;

    public ChartUtils(int type, String data) {
        this.type = type;
        this.data = data;
    }

    public String createChart() {
        String str = "";
        switch (type) {
            case 0:
                str = createLineTable();
                break;
            case 1:
                str = createPieTable();
                break;
            default:
                str = createclumnTable();
                break;
        }
        return str;
    }

    private String createLineTable() {
        return "線性圖";
    }

    private static String createPieTable() {
        return "餅狀圖";
    }

    private static String createclumnTable() {
        return "柱形圖";
    }
}

問題
1.代碼冗余,沒有對圖表的公共行為進(jìn)行提取;
2.違背了開閉原則(對于擴(kuò)展是開放的,對于修改是關(guān)閉的);
3.ChartUtils類中包含表格的創(chuàng)建、繪制、類型判斷等,過于復(fù)雜,違反了單一原創(chuàng);
4.需要維護(hù)表格的類型,每一種type,對應(yīng)一種表格,增加了維護(hù)成本;

以上問題該如何解決?來看看簡單工廠模式

簡單工廠模式(Simple Factory Pattern)

概念
定義一個工廠類,它可以根據(jù)參數(shù)的不同返回不同類的實例,被創(chuàng)建的實例通常都具有共同的父類。因為在簡單工廠模式中用于創(chuàng)建實例的方法是靜態(tài)(static)方法,因此簡單工廠模式又被稱為靜態(tài)工廠方法(Static Factory Method)模式,它屬于類創(chuàng)建型模式。
知識要點
用戶提出需求,工廠返回結(jié)果,用戶無需關(guān)心具體實現(xiàn);

標(biāo)準(zhǔn)類圖

簡單工廠模式類圖

角色分析
-Factory(工廠角色):是用戶直接接觸的方法,負(fù)責(zé)產(chǎn)品實例的創(chuàng)建以及產(chǎn)品邏輯實現(xiàn)。
-Product (抽象產(chǎn)品角色):是所有產(chǎn)品的父類,為工廠提供了公共方法。
-ConcreteProduct (具體產(chǎn)品角色):是產(chǎn)品的具體實現(xiàn)類。

案例分析
1.圖表案例類圖設(shè)計

圖表類簡單工廠模式類圖.png

2.代碼實現(xiàn)

//圖表接口類
public interface Chart {
    //初始化圖表
    void init();

    //顯示圖表
    public void show();
}


//餅狀圖類
public class PieChart implements Chart {
    public PieChart() {
        init();
    }

    @Override
    public void init() {
        System.out.println("初始化餅狀圖");
    }

    @Override
    public void show() {
        System.out.println("顯示餅狀圖");
    }
}


//線性圖類
public class LineChart implements Chart {
    public LineChart() {
        init();
    }

    @Override
    public void init() {
        System.out.println("初始化線性圖");
    }

    @Override
    public void show() {
        System.out.println("顯示線性圖");
    }
}


//柱形圖類
public class ClumnChart implements Chart{
    public ClumnChart() {
        init();
    }

    @Override
    public void init() {
        System.out.println("初始化柱形圖");
    }

    @Override
    public void show() {
        System.out.println( "顯示柱形成");
    }
}


//簡單工廠類
public class ChartFactory {

    public static final int CHART_LINE = 100;   //線性圖
    public static final int CHART_PIE = 101;    //餅狀圖
    public static final int CHART_CLUMN = 102;  //柱形圖

    public static Chart getChart(int type) {
        Chart chart;
        if (type == CHART_LINE) {
            chart = new LineChart();
        } else if (type == CHART_PIE) {
            chart = new PieChart();
        } else {
            chart = new ClumnChart();
        }
        return chart;
    }
}


//具體實現(xiàn)類
public class UserChart {
    public static void main(String[] args) {
        //顯示圖表
        ChartFactory.getChart(ChartFactory.CHART_CLUMN).show();
    }
}

總結(jié)

簡單工廠模式,有如下幾個優(yōu)點:
1.耦合性低,將用戶和產(chǎn)品進(jìn)行分類;
2.單一入口,減少記憶量;
3.遵循開閉原則,使用不需要修改相關(guān)代碼;
缺點如下:
1.不方便拓展,新增圖表需要修改除抽象產(chǎn)品之外的所有代碼;
2.隨著產(chǎn)品的增加,工廠類的邏輯復(fù)雜度也會增加;

使用場景

產(chǎn)品類型基本固定,用戶會經(jīng)常切換產(chǎn)品的場景;
例如:android中的圖片三級緩存、GreenDao 數(shù)據(jù)類型的切換等

中級:工廠方法模式

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 設(shè)計模式匯總 一、基礎(chǔ)知識 1. 設(shè)計模式概述 定義:設(shè)計模式(Design Pattern)是一套被反復(fù)使用、多...
    MinoyJet閱讀 4,095評論 1 15
  • 簡單工廠模式雖然簡單,但存在一個很嚴(yán)重的問題。當(dāng)系統(tǒng)中需要引入新產(chǎn)品時,由于靜態(tài)工廠方法通過所傳入?yún)?shù)的不同來創(chuàng)建...
    justCode_閱讀 1,312評論 1 9
  • 工廠模式是最常用的一類創(chuàng)建型設(shè)計模式,通常我們所說的工廠模式是指工廠方法模式,它也是使用頻率最高的工廠模式。本章將...
    justCode_閱讀 955評論 0 3
  • 江錦云二十七歲那年,參加了人生第一場公司的面試。 她不知道她要去哪里,不知道自己將要做什么,但是她迫切的想逃離那座...
    江郎盡閱讀 462評論 0 2
  • 在陸向謙創(chuàng)新創(chuàng)業(yè)課中,引發(fā)了一些思考。 里面說到微營銷與傳統(tǒng)營銷的區(qū)別,“人人都是記者,每個人都在現(xiàn)場”這句話我是...
    STANEM閱讀 358評論 0 0

友情鏈接更多精彩內(nèi)容