工厂方法模式
一、简介
定义:定义一个用于创建对象的接口,让子类决定实例化那个类
二、使用场景
在任何需要生成复杂对象的地方都可以使用工厂方法模式
三、工厂方法的简单实现
private static final String TAG = "FactoryPattern";
//抽象产品类
public abstract class Computer {
protected String mBoard;
protected String mDisplay;
protected String mOs;
abstract void create();
}
//具体产品类ComputerA
public class ComputerA extends Computer {
@Override
void create() {
Log.i(TAG, "create: ComputerA");
}
}
//具体产品类ComputerB
public class ComputerB extends Computer {
@Override
void create() {
Log.i(TAG, "create: ComputerB");
}
}
//抽象工厂类
public abstract class ComputerFactory{
public abstract <T extends Computer> T createComputer(Class<T> cl);
}
//具体工厂类
public class MyComputerFactory extends ComputerFactory{
@Override
public <T extends Computer> T createComputer(Class<T> cl) {
try {
return cl.newInstance();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
return null;
}
}
我们可以根据需求通过继承抽象工厂类ComputerFactory来生成多个工厂,这又可以称为多工厂方法模式,但是如果我们简化掉抽象工厂类且只定义一个工厂类这种方式又称为简单工厂模式或静态工厂模式。
简单工厂模式的缺点就是可实例化的类型在编译期间已经被确定,如果增加新类型,则需要修改工厂,违背了开放封闭原则(ASD) 。 简单工厂需要知道所有要生成的类型,当子类过多或者子类层次过多时不适合使用。
四、Android中工厂方法模式的使用
List和set继承自Collection而Collection继承自Iterable,Iterable接口有一个iterator方法,所以List和set的子类要实现该方法,实际上List和set的子类在实现的iterator方法就是构造并返回一个迭代器对象,这可以看做是一个工厂模式。
还有就是Activity的onCreate方法也是工厂模式的使用,在该方法中我们构造所需要的View并设置给当前界面,不同的Activity构造的View是不同的,这就是工厂模式。