![simply_factory.png simply_factory.png]()
版权声明:本文为博主原创文章,未经博主允许不得转载
PS:转载请注明出处
作者: TigerChain
地址: http://www.jianshu.com/p/36fe35ad743a
本文出自 TigerChain 简书 人人都会设计模式
教程简介
- 1、阅读对象
本篇教程适合新手阅读,老手直接略过
- 2、教程难度
初级
- 3、Demo 地址
稍后 提供
正文
一、什么是简单工厂
1、 生活中的工厂
简单工厂,从字面意思也能理解出来,就是一个很简单的工厂「W T F」,说了等于没有说是吧。我们先说说工厂吧
工厂就是一个制造厂,在生活中工厂太多太多了,比如车厂就是用来造车的,双汇就是出火腿肠的「当然不只是火腿」,烟草厂就是制作和加工香烟的,等等。
生活中的这些工厂是如何工作的呢?比如双汇制作火腿肠,肯定是把肉送进去,根据若干程序最后出来就是火腿。「如果想要鸡肉肠,那么加点鸡肉,玉米的加点玉米」,也就是说给定一些原材料「玉米、肉」出来的就是玉米肠,也就是说工厂就是输入东西----然后制造出我想要的东西「至于你怎么样制造的,我管你呢」
2、 程序中的工厂
程序是源于生活的,所以程序中的工厂和生活中的工厂非常类似,生活工厂中的产品非常多,但是在程序中工厂的作用就是创造对象。
简单工厂模式定义
简单工厂模式又称为静态工厂模式,简单工厂模式的作用就是创建一个工厂类用来创建其它类的实例,至于类是怎么样创建的对用户来说是不可见的「屏蔽细节」
简单工厂模式结构
| 角色 |
类别 |
说明 |
| Product |
产品类 |
一般是一个抽象类或是接口 |
| ConcreteProduct |
具体的产品类 |
实现或是继承 Product |
| Factory |
工厂类 |
用来创建具体的产品 |
简单工厂模式的 UML 图
![简单工厂 UML 简单工厂 UML]()
二、简单工厂举例
比如我有苹果、桔子、等水果,然后有一个榨汁机,我给一个苹果就给我榨出苹果汁,给桔子就出桔汁。
分析一下:
在这个例子中,果汁就是我们的产品,而苹果汁,桔子汁就是我们的具体的产品,榨汁机就是我们的工厂,而苹果,桔子等水果就是我们输送的原材料
写代码
写代码之前先看看榨汁机工厂的 UML 图
![榨汁机工厂 榨汁机工厂]()
/**
* @Description 创建一个果汁接口
* @Creator TigerChain(创建者)
*/
public interface IJuice {
String getName() ;
//也可以声明一些其它的业务方法
}
- 2、定义具体的产品,苹果汁「
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 "我是桔子汁";
}
}
- 3、创建榨汁机「工厂类」 JuiceFactory.java
/**
* @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 ;
}
}
}
![试试榨汁机 试试榨汁机]()
这样我们一个简单的工厂模式就完了,是不是很简单「所以才叫简单工厂模式吗 (*^__^*)」
三、从 Android 中看简单工厂
BitmapFactory
在 Android 中我们经常使用 Bitmap ,其实和 Bitmap 相关的 BitmapFactory 就是一个简单工厂模式
我们来看看 BitmapFactory 的方法
![BitmapFactory_method.png BitmapFactory_method.png]()
可以看到 BitmapFactory 分为两类,一类是普通原静态方法「红色框中」,第二类是 JNI 调用的方法「黄色框内」
其实从字面意思我们也可以看到 BitmapFactory 就是 Bitmap 的工厂就是用来生成 Bitmap 的
概括起来 BitmapFactory 生成 Bitmap 无非就是根据三种输入源「各个参数」
- 1、图片的路径
- 2、图片的二进制文件
- 3、图片的流
好我们现在就拿简单工厂模式来分析 BitmapFactory ,为什么说 BitmapFactory 是一个简单工厂模式
BitmapFactory UML 分析
通过前面的学习,我们知道简单工厂模式要有一个产品「抽象类」,具体产品「实现类」,还要有一个工厂,我们拿这三样对比 BitmapFactory 就可以了 ,我们看到是这样的
![BitmapFactory 的简易 UML BitmapFactory 的简易 UML]()
纳尼?这是简单工厂模式吗?怎么和简单工厂模式的结构匹配不上呢,话说我的产品接口呢?
这肯定是简单工厂模式,没看比我们前面的简单工厂模式结构还简单吗?*^__^*,还有谁 TM 说一定必须得有抽象产品这么一说「反正我没有说」,为什么呢?因为 BitmapFactory 很明确就是创建 bitmap 的「功能很单一」,这里的 bitmap 就是我的具体产品「只有这一个产品呀,你咬我呀」,我还需要抽象产品接口吗?肯定不需要了。
BitmapFactory 生成 Bitmap 流程
大概看一个 BitmapFactory 生成 Bitmap 的一个流程吧,这里以 decodeFile(String filePath) 为例来说明
![bitmapfactory_decodefile.png bitmapfactory_decodefile.png]()
上图已经很清楚的看到使用 BitmapFactory.decodeFile(String filePath) 生成一张 Bitmap 的过程了「最后是调用 JNI 来生成 Bitmap 的」,其它的方法过程都是类似,其实这一张图就是生成一张 Bitmap 的细节,而使用 BitmapFactory 就是把这些细节都屏蔽了,我管你杂生成的,我给你一个图片路径你给我生成一个 Bitmap 就好了
2、Executors 「它不是 Android 固有,Java 中就有」
我们对 Executors 应该不会陌生「这里不过多讲 Executors,只是感受一下简单工厂模式」,Executors 是用来创建线程池的,其它它也是一个工厂,我们来看看吧
我们来看看 Executors 的方法
![Executors 的部分方法 Executors 的部分方法]()
在这里,我只截取了部分方法,我们可以看到 Executors 有一些创建缓存线程池等等一系列方法,并且其中还有一个线程工厂「图中红色框,从名字可以看出」
Executors 简单的 UML
![Executors 简单的 UML Executors 简单的 UML]()
上图是 Executors 简单的一个 UML 没有全部画出,大概意思基本上表明了,我们从图中可以看出,Executors 完全就是一个简单工厂模式,基本上符合我们简单工厂模式的结构,只不过多了几个接口和类而已「我们只看(1),(2),(3) 就完全符合简单工厂模式」,也就是我给你一些参数你给我创建我想要的线程池即可
四、简单工厂的优缺点
优点:
- 实现起来非常简单「不然叫毛个简单工厂呢」,也充分利用了多态机制
- 解耦「使调用端不再创建对象,而是交给工厂去创建」,并且对内部实现屏蔽「调用端不知道具体实现」
- 分工明确,并且能更好的体现出代码含义
缺点:
- 工厂静态方法无法继承
- 代码维护不容易,如果想要创建更多的具体实现的对象,需要大量修改工厂
- 违反开闭原则「对扩展开放,对修改关闭」,如果有一个新的对象要添加,那么就要修改工厂
以上就是对简单工厂模式的一个介绍,确实挺简单的,一定要动手练练
公众号:TigerChain
![TigerChain TigerChain]()