名称: FactoryMethod 工厂模式
概要: 定义一个创建对象的接口, 让子类决定实例化哪一个类. 工厂方法使一个类的实例化延迟到子类
public class Factory{
public static Product createProduct(){
return new ConcreteProduct();
}
}
动机:
- 当你要生成复杂对象时,可以是工厂模式
- 良好的封装性, 代码清晰, 不需要知道对象的创建过程, 减低耦合
- 产品类如何变化, 调用者不需要关心, 调用者只要关心产品的接口就可以,接口不变, 上层调用者就不需要改变
- 工厂方法符合迪米特法则, 只需要知道产品的抽象类就可以了, 不关心具体实现类.也符合依赖倒置, 只依赖抽象类, 当然也符合里氏替换,子类替换父类产品
做法:
- 工厂和产品两个维度; Product接口下面有多个产品, Factory抽象类下面有多个工厂
- 每个工厂负责创建自己的产品
范例
- 产品接口 Moveable
- 工厂抽象类 BaseFactory
- 具体工厂类 PlaneFactory , CarFactory
- 具体产品 Car , Plane
public abstract class BaseFactory {
abstract Moveable create();
}
public interface Moveable {
void go();
}
public class CarFactory extends BaseFactory{
public Moveable create() {
return new Car();
}
}
public class Car implements Moveable {
public void go() {
System.out.println("Car go wuwuwuwuw....");
}
}
public class PlaneFactory extends BaseFactory{
@Override
Moveable create() {
return new Plane();
}
}
public class Plane implements Moveable {
public void go() {
System.out.println("plane flying shushua....");
}
}
public static void main(String[] args) {
Moveable m = new CarFactory().create();
m.go();
Moveable p = new PlaneFactory().create();
p.go();
}
实际源码中的使用场景
Glide
- 抽象工厂 ConnectivityMonitorFactory
- 工厂类 DefaultConnectivityMonitorFactory
- 产品基类 ConnectivityMonitor
- 产品类 DefaultConnectivityMonitor
public interface ConnectivityMonitor extends LifecycleListener {
interface ConnectivityListener {
void onConnectivityChanged(boolean isConnected);
}
}
public interface ConnectivityMonitorFactory {
@NonNull
ConnectivityMonitor build(
@NonNull Context context, @NonNull ConnectivityMonitor.ConnectivityListener listener);
}
public class DefaultConnectivityMonitorFactory implements ConnectivityMonitorFactory {
private static final String TAG = "ConnectivityMonitor";
private static final String NETWORK_PERMISSION = "android.permission.ACCESS_NETWORK_STATE";
@NonNull
@Override
public ConnectivityMonitor build(
@NonNull Context context, @NonNull ConnectivityMonitor.ConnectivityListener listener) {
int permissionResult = ContextCompat.checkSelfPermission(context, NETWORK_PERMISSION);
boolean hasPermission = permissionResult == PackageManager.PERMISSION_GRANTED;
return hasPermission
? new DefaultConnectivityMonitor(context, listener)
: new NullConnectivityMonitor();
}
}
@Override
public void onConnectivityChanged(boolean isConnected) {
if (isConnected) {
synchronized (RequestManager.this) {
requestTracker.restartRequests();
}
}
}
summary:
glide默认会给提供DefaultConnectivityMonitorFactory, 使用它创建DefaultConnectivityMonitor对象来监听网络状态, 利用Lifecycle拿到生命周期在onstart注册网络监听, 当监听到网络改为已连接, 会执行加载数据restartRequests.