工厂模式 android,当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
注意
重回出发点,我们之所以采用工厂模式,是为了解耦,其实有时我们使用工厂模式的时候,一不小心就变成了抽象工厂模式,而对于抽象工厂模式,当减少一个方法使的提供的产品不再构成产品族之后,它就演变成了工厂方法模式。
而这一切,我觉得没必要分的很清楚,我们只需要记住初衷,解耦。
相关文章:

抽象工厂模式 java实例 tclhaier_Unity常用的设计模式_工厂模式系列之抽象工厂模式...
在工厂方法模式中,工厂只负责生产具体的产品,每一个具体的工厂对应着一个具体的产品,工厂方法也具有唯一性,如果有时候我们需要一个工厂方法提供多个产品而不是一个单一的产品,例如:海尔品牌不止生产海尔TV…

npm-run 自动化
为什么使用npm run 插件不需要全局安装,只要安装在工程项目中,npm上的包提供了命令行接口,可以直接使用这些局部安装的插件; 举例(babel): 在工程项目中局部安装babel、转码规则后,直接在终端中…

docker 安装 oracle12,使用Docker安装Oracle 12c
使用Docker安装Oracle 12c假设你的服务器已成功安装Docker,继续进行以下操作:1. 启动Docker[rootnode01 ~]# service docker start2. 从远程仓库搜索oracle image[rootnode01 ~]# docker search oracleINDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATEDd…

python3 面向对象(一)
以Student类为例,定义类通过 class 关键字 class Student(object):pass class 后面紧接着是类名,即 Student,类名通常是大写开头的单词,紧接着是 (object),表示该类是从哪个类继承下来的 >>> stu Student() …

shell监控java接口服务_Linux系统下Java通过shell脚本监控重启服务
简介最近运维人员提出需求,增加一个运维页面, 查询当前的业务进程信息包括:进程名称、启动命令、启动时间、运行时间等,可以通过页面点击重启按钮,可以重启后端的一系列系统进程。思路java程序获取linux进程信息可以通…

signature=680da11b802226668317d65ae7c38eb7,encryption with designated verifiers
摘要:The offline keyword guessing attack (KG attack) is a new security threat to the searchable public key encryption with designated verifier. Many techniques have been proposed to resist such an attack. However, all these techniques are only s…

PHPMailer类 发送邮件
/*** [sendMail 邮件发送类]* param [string] $address [收件人的邮件地址]* param [string] $nickname [收件人的昵称]* param [string] $subject [邮件的标题]* param [string] $content [邮件的内容]* param [string] $attachment [邮件的附件]* return …

oracle两张表 比较好,比较Oracle两张表的数据是否一样
比较Oracle两张表的数据是否一样爱搞机 2008-10-21 11:00在某些情况下,我们会需要比较两张表的数据是否一样。假设有两张表A与表B他的字段相同,但是当中的数据可能不同,而且有些字段的数据还有可能为空方法一(手动):把需要比较的两…

java applet 缺陷_Java Applet在最新JRE上的奇怪性能行为(7.55)
我们使用来自签名提供商的一些专有小程序来签署一些XML.当我们使用JRE 6u37 applet运行没有问题 – 运行速度非常快,从不冻结.但是当我们将JRE更新为7u55或更新时,它经常开始挂起.只有浏览器重启帮助.有没有办法解决这个问题可能是由一些参数或其他东西?这是运行代码…

在线考试系统html模板,请问谁有在线考试系统的网页模板?
请问谁有在线考试系统的网页模板?(2017-03-22 22:58:03)标签:杂谈《帝国网站管理系统》英文译为"EmpireCMS",简称"Ecms",它是基于B/S结构,且功能强大而帝国CMS-logo易用的网站管理系统。本系统由帝…

三角形(css3)
1 .userCard .sanjiao {//三角形的制作;2 width: 0;3 height: 0;4 border-left: 10px solid transparent;5 border-right: 10px solid transparent;6 border-bottom: 10px solid rgba(0, 0, 0, .9);7 margin: -23px 0 0 -10px;8 left: …

MySQL数据copy
摘自http://database.51cto.com/art/201011/234776.htm 1. 下面这个语句会拷贝表结构到新表newadmin中。 (不会拷贝表中的数据) CREATE TABLE newadmin LIKE admin 2. 下面这个语句会拷贝数据到新表中。 注意:这个语句其实只是把select语句…

oracle数据库有哪些文件构成,Oracle数据库架构中包括几层?每层都有什么元素?...
Oracle数据库架构中包括几层?每层都有什么元素?1 PL/SQL代表 A PROCEDURAL LANGUAGE/SQL B PROGRAM LANGUAGE SQL C POWER LANGUAGE SQL D 都不对2 _____引擎执行PL/SQL块A SQL B PL/SQL C ORACLE D 都不对3 一个对象可以呈现多种形式的能力称为A 多态B …

用html怎么 显示直线,html怎么用鼠标画出一条直线,鼠标移动时候要能看到线条...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼window.onload function(){var oC document.getElementById(c1);var oGC oC.getContext(2d);oC.onmousedown function(ev){var ev ev || window.event;oGC.beginPath();oGC.moveTo(ev.clientX-oC.offsetLeft,ev.clientY-oC.of…

bzoj 1962: 模型王子
呵呵呵呵http://wenku.baidu.com/link?urlo0CPVzuBDLJMt0_7Qph1T7TtdFOzu7O-apIpvaWbIYMz8ZWqBneGqI8LGtLdqpuK5fbQ_v-H01zHwPXDsPrioR5xjCDHjqJn_boYO87ikr_ 1 #include <bits/stdc.h>2 #define LL long long3 #define lowbit(x) x&(-x)4 #define inf 0x3f3f3f3f5 …

cygwin编译verilator_Windows 安装 verilator
windows bubun(cygwin)下载verilatortar xvzf verilator*.t*gzcd verilator*./configure报错./configure /cygdrive/e/download/verilator-4.016configuring for Verilator 4.016 2019-06-16checking whether to use hardcoded paths... yeschecking whether to show and stop …

navicat 几个 可用的东西
1.常用的 表格 一启动 就进入的某某连接某某数据库某某表 2. 结构 比对(菜单栏 “工具里面”) 3.数据对比 同上 4.保持连接 5.全局查询 在工具中查找 ------在数据库或模式中查找 转载于:https://www.cnblogs.com/hnqm/p/9534942.html

linux内核 semaphore,2.4内核里semaphore源码的一个疑问
博主你好, 请教一个问题.__down()里面有一段代码, 我觉得不那么保险.我先把__down的源码贴出来:void __down(struct semaphore * sem){struct task_struct *tsk current;DECLARE_WAITQUEUE(wait, tsk); //定义一个"队列项", 等待者是当前进…

Android UI体验之全屏沉浸式透明状态栏效果
前言: Android 4.4之后谷歌提供了沉浸式全屏体验, 在沉浸式全屏模式下, 状态栏、 虚拟按键动态隐藏, 应用可以使用完整的屏幕空间, 按照 Google 的说法, 给用户一种 身临其境 的体验。而Android 5.0之后谷歌…

html 多项选择,选项标签中的HTML多字段选择
这可以通过switch语句实现,但这不是最好的方法。我建议将以下函数作为change事件的事件处理程序。您还需要在窗口加载时运行它,以初始化它。function updateSel() {var sel document.getElementById(sel);var hidden sel.getElementsByClassName(hidde…

tp5.0 queue 队列操作
检查是否安装redis(没有请自行百度安装): phpinfo: 配置thinkphp-queue,没有请执行 composer require topthink/think-queue 加入: 创建 队列 文件: use think\Queue;class TestQueue {// 测试public function queue()…

java redis管理_优雅时间管理Java轻松做到,想学么?
原标题:优雅时间管理Java轻松做到,想学么?来源 |http://rrd.me/gCQHp前言:需求是这样的,在与第三方对接过程中,对方提供了token进行时效性验证,过一段时间token就会失效.后台有定时任务在获取&a…

jenkins运行日志时间与linux,Jenkins 用户文档(运行多个步骤)
运行多个步骤管道由多个步骤组成,允许你构建、测试和部署应用程序,Jenkins管道允许你以简单的方式组成多个步骤,可以帮助你为任何类型的自动化过程建模。将“步骤”想象成执行单个操作的单个命令,当一个步骤成功时,它将…

HPU组队赛B:问题(二进制枚举)
时间限制1 Second 内存限制 512 Mb 题目描述 你有n个问题,你已经估计了第i个问题的难度为Ci,现在你想使用这些问题去构造一个问题集。比赛的问题集必须包含至少两个问题,而且比赛的总难度必须至少为l至多为r,此外最简单的问题和最难的问题之间的差异至少…

html脱机不显示图片,Python绘图脱机图表嵌入HTML(不工作)
aPlot是绘图文件的文件名。在在您的iframe中,您将.embed?width800&height550添加到文件名中,这将导致一个不存在的文件名。在当您删除这个字符串时,即src" aPlot ",它应该可以工作。在不必嵌入整个HTML文件&…

数据库分库分表(sharding)系列
数据库分库分表(sharding)系列转载于:https://www.cnblogs.com/gotodsp/p/6517478.html

php imagecopy 用法,php使用imagecopymerge()函数创建半透明水印
使用imagecopymerge() 函数创建半透明水印,供大家参考,具体内容如下// 加载要加水印的图像$im imagecreatefromjpeg(photo.jpeg);// 首先我们从 GD 手动创建水印图像$stamp imagecreatetruecolor(100, 70);imagefilledrectangle($stamp, 0, 0, 99, 69,…
linux系统yum源,Linux开启安装EPEL YUM源
我们用yum安装软件时,经常发现我们的yum源里面没有该软件,需要自己去wget,然后configure,make,make install,太折腾了。其实,CentOS还有一个源叫做 EPEL (Extra Packages for Enterprise),里面有1万多个软件࿰…

MATLAB简易验证码识别程序介绍
本推文主要识别的验证码是这种:第一步: 二值化所谓二值化就是把不需要的信息通通去除,比如背景,干扰线,干扰像素等等,只剩下需要识别的文字,让图片变成2进制点阵。第二步: 文字分割为了能识别出字符,需要对…

mac终端命令-----常规操作
OSX 的文件系统 OSX 采用的Unix文件系统,所有文件都挂在跟目录 / 下面,所以不在要有Windows 下的盘符概念。 你在桌面上看到的硬盘都挂在 /Volumes 下。 比如接上个叫做 USBHD的移动硬盘,桌面上会显示出一个硬盘图标,它实际在哪里…