美文网首页
android设计模式之工厂模式

android设计模式之工厂模式

作者: 梦语少年 | 来源:发表于2017-06-10 17:57 被阅读141次

    简介:

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

    初级:简单工厂模式

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

    普通实现:

    方式一:

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

    中级:工厂方法模式

    相关文章

      网友评论

          本文标题:android设计模式之工厂模式

          本文链接:https://www.haomeiwen.com/subject/mtdfqxtx.html