版权声明:本文为博主原创文章,未经博主容许不得转载java
PS:转载请注明出处
做者: TigerChain
地址: http://www.jianshu.com/p/36fe35ad743a
本文出自 TigerChain 简书 Android 设计模式系列设计模式
教程简介缓存
正文app
简单工厂,从字面意思也能理解出来,就是一个很简单的工厂「W T F」,说了等于没有说是吧。咱们先说说工厂吧ide
工厂就是一个制造厂,在生活中工厂太多太多了,好比车厂就是用来造车的,双汇就是出火腿肠的「固然不仅是火腿」,烟草厂就是制做和加工香烟的,等等。布局
生活中的这些工厂是如何工做的呢?好比双汇制做火腿肠,确定是把肉送进去,根据若干程序最后出来就是火腿。「若是想要鸡肉肠,那么加点鸡肉,玉米的加点玉米」,也就是说给定一些原材料「玉米、肉」出来的就是玉米肠,也就是说工厂就是输入东西----而后制造出我想要的东西「至于你怎么样制造的,我管你呢」学习
程序是源于生活的,因此程序中的工厂和生活中的工厂很是相似,生活工厂中的产品很是多,可是在程序中工厂的做用就是创造对象。ui
简单工厂模式定义spa
简单工厂模式又称为静态工厂模式,简单工厂模式的做用就是建立一个工厂类用来建立其它类的实例,至于类是怎么样建立的对用户来讲是不可见的「屏蔽细节」线程
简单工厂模式结构
角色 | 类别 | 说明 |
---|---|---|
Product | 产品类 | 通常是一个抽象类或是接口 |
ConcreteProduct | 具体的产品类 | 实现或是继承 Product |
Factory | 工厂类 | 用来建立具体的产品 |
简单工厂模式的 UML 图
好比我有苹果、桔子、等水果,而后有一个榨汁机,我给一个苹果就给我榨出苹果汁,给桔子就出桔汁。
分析一下:
在这个例子中,果汁就是咱们的产品,而苹果汁,桔子汁就是咱们的具体的产品,榨汁机就是咱们的工厂,而苹果,桔子等水果就是咱们输送的原材料
写代码
写代码以前先看看榨汁机工厂的 UML 图
/** * @Description 建立一个果汁接口 * @Creator TigerChain(建立者) */ public interface IJuice { String getName() ; //也能够声明一些其它的业务方法 }
AppleJuice.java
」,桔汁「OrangeJuice.java
」# AppleJuice.java /** * @Description 一个具体的产品--- 苹果汁 * @Creator TigerChain(建立者) */ public class AppleJuice implements IJuice { public static final String TAG = "AppleJuice" ; @Override public String getName() { Log.e(TAG,"我是苹果汁") ; return "我是苹果汁"; } }
# OrangeJuice.java /** * @Description 具体的产品桔子汁 * @Creator TigerChain(建立者) */ public class OrangeJuice implements IJuice { public static final String TAG = "OrangeJuice" ; @Override public String getName() { Log.e(TAG,"我是桔子汁") ; return "我是桔子汁"; } }
/** * @Description 果汁机---工厂 * @Creator junjun(建立者) */ public class JuiceFactory { /** * 根据名称来生产不一样的果汁 * @param name * @return */ public static IJuice createJuice(String name){ IJuice iJuice = null; if(name.equals("apple")){ //苹果汁 iJuice = new AppleJuice() ; }else if(name.equals("orange")){ //桔子汁 iJuice = new OrangeJuice() ; } return iJuice ; } }
核心代码,其它的代码是布局有两个按钮和一个文本,而且添加点击事件,这里不贴代码了。
@Override public void onClick(View view) { switch (view.getId()){ case R.id.btn_create_apple: //对使用者来讲,屏蔽了具体的细节,我管你杂榨汁呢 IJuice appleJuice = JuiceFactory.createJuice("apple") ; tv_show_result.setText(appleJuice.getName()); break ; case R.id.btn_create_orange: IJuice orangeJuice = JuiceFactory.createJuice("orange") ; tv_show_result.setText(orangeJuice.getName()); break ; default: break ; } } }
这样咱们一个简单的工厂模式就完了,是否是很简单「因此才叫简单工厂模式吗 (*^__^*)」
BitmapFactory
在 Android 中咱们常用 Bitmap ,其实和 Bitmap 相关的 BitmapFactory 就是一个简单工厂模式
能够看到 BitmapFactory 分为两类,一类是普通原静态方法「红色框中」,第二类是 JNI 调用的方法「黄色框内」
其实从字面意思咱们也能够看到 BitmapFactory 就是 Bitmap 的工厂就是用来生成 Bitmap 的
归纳起来 BitmapFactory 生成 Bitmap 无非就是根据三种输入源「各个参数」
好咱们如今就拿简单工厂模式来分析 BitmapFactory ,为何说 BitmapFactory 是一个简单工厂模式
经过前面的学习,咱们知道简单工厂模式要有一个产品「抽象类」,具体产品「实现类」,还要有一个工厂,咱们拿这三样对比 BitmapFactory 就能够了 ,咱们看到是这样的
纳尼?这是简单工厂模式吗?怎么和简单工厂模式的结构匹配不上呢,话说个人产品接口呢?
这确定是简单工厂模式,没看比咱们前面的简单工厂模式结构还简单吗?*^__^*,还有谁 TM 说必定必须得有抽象产品这么一说「反正我没有说」,为何呢?由于 BitmapFactory 很明确就是建立 bitmap 的「功能很单一」,这里的 bitmap 就是个人具体产品「只有这一个产品呀,你咬我呀」,我还须要抽象产品接口吗?确定不须要了。
大概看一个 BitmapFactory 生成 Bitmap 的一个流程吧,这里以 decodeFile(String filePath) 为例来讲明
上图已经很清楚的看到使用 BitmapFactory.decodeFile(String filePath) 生成一张 Bitmap 的过程了「最后是调用 JNI 来生成 Bitmap 的」,其它的方法过程都是相似,其实这一张图就是生成一张 Bitmap 的细节,而使用 BitmapFactory 就是把这些细节都屏蔽了,我管你杂生成的,我给你一个图片路径你给我生成一个 Bitmap 就行了
二、Executors 「它不是 Android 固有,Java 中就有」
咱们对 Executors 应该不会陌生「这里不过多讲 Executors,只是感觉一下简单工厂模式」,Executors 是用来建立线程池的,其它它也是一个工厂,咱们来看看吧
在这里,我只截取了部分方法,咱们能够看到 Executors 有一些建立缓存线程池等等一系列方法,而且其中还有一个线程工厂「图中红色框,从名字能够看出」
上图是 Executors 简单的一个 UML 没有所有画出,大概意思基本上代表了,咱们从图中能够看出,Executors 彻底就是一个简单工厂模式,基本上符合咱们简单工厂模式的结构,只不过多了几个接口和类而已「咱们只看(1),(2),(3) 就彻底符合简单工厂模式」,也就是我给你一些参数你给我建立我想要的线程池便可
优势:
缺点:
以上就是对简单工厂模式的一个介绍,确实挺简单的