定义
定义一个用于创建对象的接口,让子类决定实例化哪个类。
使用场景
任何需要生成复杂对象的地方都可以使用工厂方法模式。
UML类图
关键点
(1)整个完整的工厂方法模式包括抽象工厂父类、具体工厂子类、抽象产品父类、具体产品子类。其中抽象工厂是核心,具体工厂是具体的业务逻辑,具体产品是具体工厂产生的对象。
(2)如需具体工厂子类可以返回多种具体产品,则可以利用反射的原理,通过传入不同的Class类来决定返回的类型。
(3)可以设置多个具体工厂以分开返回多种产品,此模式称为多工厂方法模式。
(4)如果确定工厂只有一个,则可以将抽象工厂类简化掉,并将对应的工厂方法改为静态方法,此模式称为简单工厂模式或者静态工厂模式,他是工厂方法模式的一个弱化版本。
实现方式
抽象产品父类:
public abstract class Product{
public abstract void method();
}
具体产品子类A:
public class ProductA extends Product{
@Override
public void method(){}
}
具体产品子类B:
public class ProductB extends Product{
@Override
public void method(){}
}
抽象工厂父类
public abstract class Factory{
public abstract Product createProduct();
public abstract T createProductByClass(Class clz);
}
具体工厂子类A
public class FactoryA extends Factory{
@Override
public Product createProduct(){
return new ProductA();
}
@Override
public T createProduct(Class clz){
return new ProductA();
}
}
可返回多种产品工厂子类:
public class MultiProductFactory extends Factory{
@Override
public Product createProduct(){
return new ProductA();
}
@Override
public T createProduct(Class clz){
Product p = null;
try{
p= (Product) Class.forName(clz.getName()).newInstance();
}catch (Exception e){
}
return(T)p;
}
}
静态工厂类:
public class staticFactoryB{
public static Product createProduct(){
return new ProductB();
}
}
工厂方法模式的优缺点
优点
>降低了各个对象之间的耦合度
>依赖于抽象架构,有非常好的扩展性
缺点
>每次往工厂方法里添加一种新产品时就需要写一个新的产品类
>引入了抽象层,导致类结构复杂化
Android中的工厂方法模型举例
Activity的各个周期方法,即onCreate()、onResume()等一系列方法。
——2017.08.02