当Android遇见工厂模式

设计模式.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就可以完成创建对象无需使用工厂模式。

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

  • UML

工厂模式.png

  • 注意
    重回出发点,我们之所以采用工厂模式,是为了解耦,其实有时我们使用工厂模式的时候,一不小心就变成了抽象工厂模式,而对于抽象工厂模式,当减少一个方法使的提供的产品不再构成产品族之后,它就演变成了工厂方法模式。
    而这一切,我觉得没必要分的很清楚,我们只需要记住初衷,解耦。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值