设计模式Android知识Java学习笔记

当Android遇见工厂模式

2016-10-22  本文已影响759人  Anderson大码渣
设计模式.png

我们先看一下一个Android系统应用中的工厂模式列子,再讲解工厂模式。

package com.android.mms.ui;

import android.content.Context;
import android.util.Log;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

import com.android.mms.model.Model;

/**
 * The factory of concrete presenters.
 */
public class PresenterFactory {
    private static final String TAG = "PresenterFactory";
    private static final String PRESENTER_PACKAGE = "com.android.mms.ui.";

    public static Presenter getPresenter(String className, Context context,
            ViewInterface view, Model model) {
        try {
            if (className.indexOf(".") == -1) {
                className = PRESENTER_PACKAGE + className;
            }

            Class c = Class.forName(className);
            Constructor constructor = c.getConstructor(
                    Context.class, ViewInterface.class, Model.class);
            return (Presenter) constructor.newInstance(context, view, model);
        } catch (ClassNotFoundException e) {
            Log.e(TAG, "Type not found: " + className, e);
        } catch (NoSuchMethodException e) {
            // Impossible to reach here.
            Log.e(TAG, "No such constructor.", e);
        } catch (InvocationTargetException e) {
            Log.e(TAG, "Unexpected InvocationTargetException", e);
        } catch (IllegalAccessException e) {
            Log.e(TAG, "Unexpected IllegalAccessException", e);
        } catch (InstantiationException e) {
            Log.e(TAG, "Unexpected InstantiationException", e);
        }
        return null;
    }
}

该代码来自于Android系统中的Mms模块Ui包下,为显示缩略图的PresenterFactory,我们可以看到,使用了反射。
工厂设计模式在实际的开发中使用得非常多,我觉得已经学习过简单的工厂模式(若没学过,即A,B实现类,P为工厂类,通过传入参数“A”,"B",P里面进行判断,若是A就new A对象,若是B则new 一个B对象返回),通过简单的工厂设计模式可以达到类的 解耦合目的,但是简单工厂设计模式依然存在问题,我们不可能在设计工厂的时候,就知道我们以后要生成哪些类,那就是在增加一个子类时都需要修改工厂类,这样很麻烦,而且那种,根据传入参数进行判断,从而自己new出不同的类的机制对于一个大型项目而言,是灾难性的。

从简单工厂模式中,对于实现类而言,的确是符合我们的开闭原则,当我们要添加新产品时,无需对业务进行修改,但是对于我们的工厂类而言,开闭原则没有很好的体现,每次都得修改。

而,我们上面粘贴的代码中,使用反射机制,这才是符合开闭原则的工厂模式。我们将类名当做参数传入,这样以后我们新建多少子类,都无需修改原来的代码。

软件设计中,解耦一直是个大问题,也看到过一些C语言的项目,耦合度令人咂舌,而java中,其实很多的耦合性就是new,只要与new搭上关系,我们便造成了一个耦合。反射机制帮助我们很好的解决了这个问题,若对反射机制不懂,可以看我的上一篇java反射机制

我们进入正题:

工厂方法模式-也我们所谓的工厂模式
定义一个用于创建对象的接口,让其决定实例化哪个类

在前面已经大概说明了使用场景,总结就是在任何需要生产复杂对象的地方,都可以使用工厂模式,复杂对象适合使用工厂模式,用new就可以完成创建对象无需使用工厂模式。

通过使用工厂方法创建对象,我们可以避免客户端代码依赖于它所使用的接口的具体实现。客户端不再需要把对象创建的构造方法注入到自己的代码中去,客户端只需要调用工厂,由工厂来决定符合要求的子类的创建过程。此外,工厂方法还可以满足每次构造不同对象、对象的构造很复杂、对象的构造依赖具体环境等等需求。

工厂模式.png
上一篇 下一篇

猜你喜欢

热点阅读