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 数据类型的切换等

中级:工厂方法模式

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

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