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)模式,它属于类创建型模式。
知识要点
用户提出需求,工厂返回结果,用户无需关心具体实现;

标准类图

android设计模式之工厂模式_第1张图片
简单工厂模式类图

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

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

android设计模式之工厂模式_第2张图片
图表类简单工厂模式类图.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 数据类型的切换等

中级:工厂方法模式

你可能感兴趣的:(android设计模式之工厂模式)