工厂方法模式(Factory Pattern),是创建型设计模式之一。
定义
定义一个用户创建对象的接口,让子类决定实例化哪个类
-
抽象产品、具体产品 创建需要实现的类的抽象类,创建子类实现抽象方法
-
抽象工厂创建工厂类,定义创建对象的方法,返回要创建的对象的抽象类
-
具体工厂创建工厂实现类,重写创建对象方法返回确定的子类对象,,每当需要的子类不同时,都需要修改具体工厂中创建的子类对象的过程。
-
使用时先生成工厂实现类对象,再有工厂实现类的方法创建需要创建的对象
使用场景
任何需要生成复杂对象的地方,用 new 就可以完成创建的对象无需使用工厂模式
使用反射实现对象的创建
只有一个工厂类实现的时候,需要哪一个产品就生产哪一个,可以利用反射更简洁地生产具体产品对象
需要哪一个类的对象就传入哪一个类的类型即可,比较简洁、动态
public abstract class IPersonFactory {
public abstract <T extends Person> T newPerson(Class<T> clazz);
}
public class PersonFactory extends IPersonFactory {
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
@Override
public <T extends Person> T newPerson(Class<T> clazz) {
T t = null;
try {
t = (T) Class.forName(clazz.getName()).newInstance();
} catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
e.printStackTrace();
}
return t;
}
}
public class Test {
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
public static void main(String[] str) {
Student s = new PersonFactory().newPerson(Student.class);
s.run();
}
}
多个工厂模式
如果创建多个工厂的子类,每个工厂都负责创建一种类型,各司其职,这种拥有多个工厂的方式称为多个工厂方法模式
简单工厂(静态工厂)
对于最初的工厂模式,如果我们确定工厂只有一个,那么可以简化掉抽象工厂类,在工厂类中定义静态的创建对象的方法,这种方式称为简单工厂或静态工厂模式
简单抽象工厂
简单工厂模式中,工厂只有一个,并且创建对象的方法是静态的,如果此时我们不允许创建工厂对象的情况下,就把该工厂定义为抽象的,这种方式叫做简答抽象工厂模式
源码中的使用
Java 源码中
List 和 Set 都继承 Collection 接口,而 Collection 继承 Iterable 接口,Iterable 接口定义了 iterator 方法 Iterator<T> iterator();
ArrayList 和 HashSet 都实现各自了 iterator 方法,并且 iterator 方法的实现就是构造并返回一个 Iterator 迭代器对象。
ArrayList 和 HashSet 的 iterator 方法其实就相当于一个工厂方法,专为 new 对象而生
Android 源码中
Activity 的 onCreate 方法,onCreate 方法中构造了一个 View 对象,并设置为当前界面的 ContentView 返回给 framwork 处理
每个 Activity 的 onCreate 方法都是构造了一个 View 对象并返回给 framwork,由此可见 onCreate 中通过 setContentView 方法为每个 Activity 设置不同的 View ,这就是工厂模式结构
每个 Activity 都相当于一个工厂,每个 onCreate 方法都是一个工厂中生成对象的方法,生成的对象就是 View 对象。
网友评论