我们知道工厂模式有三兄弟,通常我们说的工厂模式指的是工厂方法模式,它的应用频率最高。本篇博客分享的简单工厂模式是工厂方法模式的“小弟”,确切的来讲它不属于设计模式,而是一种方法。此外,工厂方法模式还有一位“大哥”——抽象工厂模式。
今天我们来分享一下简单工厂模式的一些情况,以及它在Android源码中的应用。
简单工厂模式
定义
简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。
结构
简单工厂模式所涉及到的角色:
- Product(抽象产品角色):产品的通用接口,定义产品的行为。
- ConcreteProduct(具体产品角色):具体产品类,实现了Product接口。
- Creator(工厂角色):工厂类,通过静态工厂方法factoryMethord来创建对象。
实现
抽象产品角色
1 2 3 4 5 6 7 8 9 |
abstract class Product { //所有产品类的公共业务方法 public void methodSame() { //公共方法的实现 } //声明抽象业务方法 public abstract void methodDiff(); } |
具体产品角色
1 2 3 4 5 6 |
class ConcreteProduct extends Product { //实现业务方法 public void methodDiff() { //业务方法的实现 } } |
工厂角色
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class Creator { //静态工厂方法 public static Product getProduct(String arg) { Product product = null; if (arg.equalsIgnoreCase("A")) { product = new ConcreteProductA(); //初始化设置product } else if (arg.equalsIgnoreCase("B")) { product = new ConcreteProductB(); //初始化设置product } return product; } } |
使用场景
在以下情况下可以考虑使用简单工厂模式:
- 工厂类负责创建的对象比较少,由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。
- 客户端只知道传入工厂类的参数,对于如何创建对象并不关心。
优点
- 工厂类包含必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的职责,而仅仅“消费”产品,简单工厂模式实现了对象创建和使用的分离。
- 客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可,对于一些复杂的类名,通过简单工厂模式可以在一定程度减少使用者的记忆量。
缺点
- 系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。
- 简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构。
Android中简单工厂模式的应用
在Android中我们了解的使用到了简单工厂方法的地方有Bitmap对象的获取、Fragment创建等。接下来我们分开看一下。
Bitmap源码分析
首先来说我们是不能通过new方法来创建Bitmap对象的,因为Bitmap类的构造函数是私有的,只能是通过JNI实例化。
接下来我们随便找个入口开始看,比如:
1 |
Bitmap bmp = BitmapFactory.decodeFile(String pathName); |
我们把源码中的调用关系找出来,如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 rayon-num crayon-striped-num" data-line="crayon-5812a0a4be168231410299-52">52 53 54 55 56 ֹ法模式的“小弟”,确切的来讲它不属于设计模式,而是一种方法。此外,工厂方法模式还有一位“大哥”——抽象工厂模式。
今天我们来分享一下简单工厂模式的一些情况,以及它在Android源码中的应用。 简单工厂模式定义简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。 结构简单工厂模式所涉及到的角色:
实现抽象产品角色
具体产品角色
工厂角色
使用场景在以下情况下可以考虑使用简单工厂模式:
优点
缺点
Android中简单工厂模式的应用在Android中我们了解的使用到了简单工厂方法的地方有Bitmap对象的获取、Fragment创建等。接下来我们分开看一下。 Bitmap源码分析首先来说我们是不能通过new方法来创建Bitmap对象的,因为Bitmap类的构造函数是私有的,只能是通过JNI实例化。 接下来我们随便找个入口开始看,比如:
我们把源码中的调用关系找出来,如下
|