阅读 23

FactoryMethod 工厂模式

名称: 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.

文章分类
阅读
文章标签