上次谈到“建造者模式”,本次探讨一下“工厂模式”在Android API中的应用。工厂模式:定义一个创建产品对象的工厂接口,让子类决定实例化哪一种实例对象,也就是将创建实例对象的工作推迟到子类当中,核心工厂类不再负责具体产品的创建。
存在这样几个角色:
1、抽象工厂
2、抽象产品
3、具体工厂
4、具体产品
Android中的应用:创建位图
例如
Bitmap bitmap=BitmapFactory.decodeResource(getResources(), R.drawable.ic_action_search);
这条语句相信我们经常用到,BitmapFactory顾名思义,就是位图工厂,专门用来将制定的图片转化为指定的位图Bitmap。
因为图片来源的不同可能导致图片大小,格式类型等的多种多样,这样就导致了生成目标对象的复杂度,因此通过工厂统一的加工成同样大小,类型的“标准件”
大大简化了代码的复杂度与工作量。
-----------------------------------------------------------------------------------------------------------
下面举例剖析一下,BitmapFactory的用例过程:
需要生成四个对象:
工厂接口: IFactory
工厂实体类:Factory
抽象产品: AbstructBitmap
实体产品: Bitmap
结构如图:
------------------------------------------------------------------------------------------------------------
第一步:抽象产品类 AbstructBitmap
public abstract class AbstructBitmap {
String name;
public AbstructBitmap() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
第二步:实体产品Bitmap
public class Bimap extends AbstructBitmap {
public Bimap(String name) {
this.setName(name);
}
}
第三步:核心工厂接口IFactory
public interface IFactory {
public AbstructBitmap decodeResource(String name); //注意:返回的是位图抽象类
}
第四步:具体工厂Factory
public class Factory implements IFactory{
@Override
public AbstructBitmap decodeResource(String name) {
return new Bimap(name);
}
}
----------------------------------------------------------------------------------------------------------------
应用:
IFactory factory=new Factory();
AbstructBitmap product= factory.decodeResource(" I'm Bitmap !");
System.out.println("--------------------"+product.getName());
至此结束!
其实过程也没什么复杂的,关键还是思想!
**********************************************************************************
工厂模式的设计原则:
1、开闭原则:对扩展开放,对修改关闭。即使某个功能模块在不被修改的前提下被扩展
2、依赖倒置原则:不论工厂还是产品都应该依赖于抽象,而不是具体实现类
使用场合:
1、当子类型可能会有很多,以后需要不断增添不同的子类实现时;
2、当一个系统会有尚在框架设计阶段,还不知道将来需要实例化哪些具体类时;
3、系统设计之初不需要具体对象的概念(或者说是没有具体对象的概念);