android设计模式之工厂模式

简介:

工厂模式是创建型设计模式的一种,它使用户不必关心具体产品的生产,直接获取想要的结果。工厂模式包括:简单工厂模式,工厂方法模式,抽象工厂模式;对应难度,初级、中级、高级三个不同的难度等级。而常说的工厂模式,通常是指代工厂方法模式。
参考连接

初级:简单工厂模式

以下创建一个简单的表格显示实例,来理解简单工厂模式;

普通实现:

方式一:

/**
 * Created by zhangxuehui on 2017/6/9.
 * 普通模式,实现图表
 */
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.使用那种图表就要创建具体的图表实例;
2.代码冗余,会产生大量重复代码;
3.不便于维护,如改变所有图表的颜色;
4.需要对每一个图表类进行充分的理解;

方式二:

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.代码冗余,没有对图表的公共行为进行提取;
2.违背了开闭原则(对于扩展是开放的,对于修改是关闭的);
3.ChartUtils类中包含表格的创建、绘制、类型判断等,过于复杂,违反了单一原创;
4.需要维护表格的类型,每一种type,对应一种表格,增加了维护成本;

以上问题该如何解决?来看看简单工厂模式

简单工厂模式(Simple Factory Pattern)

概念
定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。因为在简单工厂模式中用于创建实例的方法是静态(static)方法,因此简单工厂模式又被称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。
知识要点
用户提出需求,工厂返回结果,用户无需关心具体实现;

标准类图

简单工厂模式类图

角色分析
-Factory(工厂角色):是用户直接接触的方法,负责产品实例的创建以及产品逻辑实现。
-Product (抽象产品角色):是所有产品的父类,为工厂提供了公共方法。
-ConcreteProduct (具体产品角色):是产品的具体实现类。

案例分析
1.图表案例类图设计

图表类简单工厂模式类图.png

2.代码实现

//图表接口类
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;
    }
}


//具体实现类
public class UserChart {
    public static void main(String[] args) {
        //显示图表
        ChartFactory.getChart(ChartFactory.CHART_CLUMN).show();
    }
}

总结

简单工厂模式,有如下几个优点:
1.耦合性低,将用户和产品进行分类;
2.单一入口,减少记忆量;
3.遵循开闭原则,使用不需要修改相关代码;
缺点如下:
1.不方便拓展,新增图表需要修改除抽象产品之外的所有代码;
2.随着产品的增加,工厂类的逻辑复杂度也会增加;

使用场景

产品类型基本固定,用户会经常切换产品的场景;
例如:android中的图片三级缓存、GreenDao 数据类型的切换等

中级:工厂方法模式

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容

  • 设计模式汇总 一、基础知识 1. 设计模式概述 定义:设计模式(Design Pattern)是一套被反复使用、多...
    MinoyJet阅读 3,922评论 1 15
  • 简单工厂模式虽然简单,但存在一个很严重的问题。当系统中需要引入新产品时,由于静态工厂方法通过所传入参数的不同来创建...
    justCode_阅读 1,181评论 1 9
  • 工厂模式是最常用的一类创建型设计模式,通常我们所说的工厂模式是指工厂方法模式,它也是使用频率最高的工厂模式。本章将...
    justCode_阅读 850评论 0 3
  • 江锦云二十七岁那年,参加了人生第一场公司的面试。 她不知道她要去哪里,不知道自己将要做什么,但是她迫切的想逃离那座...
    江郎尽阅读 328评论 0 2
  • 在陆向谦创新创业课中,引发了一些思考。 里面说到微营销与传统营销的区别,“人人都是记者,每个人都在现场”这句话我是...
    STANEM阅读 305评论 0 0