定义:工厂模式定义了一个接口,让使用者更简洁,正确的实例化对象。
用处:工厂模式适合较为复杂的对象的创建。但是其实工厂模式没有用的那么模块化,我们平时看到的好多源码就是工厂模式。
例子:在一个产品详情页面,一个产品的状态有好几种,没有购买,购买了。。。我们可以用不同的产品来封装不同的状态,这样这些状太更加整洁,而不是在很多的if-else中凌乱。
先定义一个状态的抽象类,来约束子类封装不同状态。(这是工厂模式的产品基类)
public abstract class ViewStatus {
public abstract void setStatus(String statusDes);
}
然后,定义该产品不同的状态(不同的产品)
public class StatusOne extends ViewStatus {
@Override
public void setStatus(String statusDes) {
System.out.println("没购买:"+statusDes);
}
}
购买了的状态:
public class StatusTwo extends ViewStatus {
@Override
public void setStatus(String statusDes) {
System.out.println("购买:" + statusDes);
}
}
接下来该工厂基类了
public abstract class Factoy {
public abstract ViewStatus createStatus();
}
实例化不同的状态的工厂
/**
* 没有购买的工厂
*/
public class StatusOneFactor extends Factoy {
@Override
public ViewStatus createStatus() {
return new StatusOne();
}
}
/**
* 购买的状态
*/
public class StatusTwoFactor extends Factoy {
@Override
public ViewStatus createStatus() {
return new StatusTwo();
}
}
使用该工厂模式:
Factoy factoy = new StatusOneFactor();
ViewStatus statusOne = factoy.createStatus();
statusOne.setStatus("购买了!");
Factoy factoy1 = new StatusTwoFactor();
ViewStatus statusOne1 = factoy1.createStatus();
statusOne1.setStatus("没购买!");
总结:实例化需要的状态工厂,然后取出该状态,最后去使用就好了。这个例子是多工厂模式,当我们的工厂只需要一个的时候可以简化工厂模式的父类,做一个静态工厂。(当然那些只有一个工厂的有点不符合对修改关闭)
工厂模式的优点:
- 我们有一堆不同状态的类需要创建时,我们可以使用工厂模式。因为他可以很好的封装这些状态和封装创建,使用起来方便。
- 可以封装创建比较麻烦的类,这样不需要使用者去了解类中的实现。
- 符合设计模式规则,对拓展开放最修改关闭。
案例:
1.安卓中我们的activity,其实就是谷歌工程师已经封装好的工厂模式,我们只需要每次创建不同的产品,即继承Activity的不 同页面。
public Activity newActivity(ClassLoader cl, String className,
Intent intent)
throws InstantiationException, IllegalAccessException,
ClassNotFoundException {
return (Activity)cl.loadClass(className).newInstance();
}
其实,就是用反射做的工厂。给frameWork返回我们的不同activity。我们可以将工厂类稍微修改一下,优点就是工厂类不需要对不同产品都去做个工厂类。缺点:反射的缺点,运行较慢。
public <T extends ViewStatus> T createStatues(Class<T> tClass){
ViewStatus viewStatus = null;
try {
viewStatus= (ViewStatus) Class.forName(tClass.getName()).newInstance();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return (T)viewStatus;
}
2.我们平时每一个activity封装自己的跳转方法,既可以减少代码冗余,也可以表明该类跳转需要的不同参数。
public static void toActivity(Context context){
Intent intent=new Intent(context,HaAcitivity.class);
context.startActivity(intent);
}
这些都是工厂模式的一种实现。