使用场景 实现方式
构造复杂对象,且对象细节不想被用户知道 定义简单工厂或者抽象工厂去完成对象的创建,一般使用抽象工厂好点,因为可以替换为二代工厂,或者在工厂内替换生产者的实现类
在三方库中发威 hilt 使用对应的 factory 构造对应的类,例如 我们使用 inject 注解定义的注入项就会生成的对应 factory 例如下面代码 GrowthTest
项目中实践 在广告 SDK 中使用 工厂模式产生对应的处理类

package com.xpj.mygrowthpath;

import dagger.internal.Factory;
import javax.annotation.Generated;
import javax.inject.Provider;

@Generated(
    value = "dagger.internal.codegen.ComponentProcessor",
    comments = "https://dagger.dev"
)
@SuppressWarnings({
    "unchecked",
    "rawtypes"
})
public final class GrowthTest_Factory implements Factory<GrowthTest> {
  private final Provider<GrowthTestInner> innerProvider;

  public GrowthTest_Factory(Provider<GrowthTestInner> innerProvider) {
    this.innerProvider = innerProvider;
  }

  @Override
  public GrowthTest get() {
    return newInstance(innerProvider.get());
  }

  public static GrowthTest_Factory create(Provider<GrowthTestInner> innerProvider) {
    return new GrowthTest_Factory(innerProvider);
  }

  public static GrowthTest newInstance(GrowthTestInner inner) {
    return new GrowthTest(inner);
  }
}


抽象工厂架构图

package com.example.xpj.factorys;

import com.example.xpj.DPConstants;

public class DPFactory {
    public enum PhoneBrand {
        MI, IPHONE, MOTO
    }

    public enum PCBrand {
        LENOVO, MICROSOFT
    }

    public interface Phone {
        String brand();
    }

    public interface PC {
        String brand();
    }

    public static class Mi implements Phone {
        @Override
        public String brand() {
            return "mi";
        }
    }

    public static class IPhone implements Phone {
        @Override
        public String brand() {
            return "iphone";
        }
    }

    public static class MOTO implements Phone {
        @Override
        public String brand() {
            return "moto";
        }
    }

    public static class Lenovo implements PC {
        @Override
        public String brand() {
            return "lenovo";
        }
    }

    public static class Mirosoft implements PC {
        @Override
        public String brand() {
            return "mirosoft";
        }
    }

    public static class PhoneFactory {
        public Phone createPhone(PhoneBrand brand) {
            switch (brand) {
                case MI:
                    return new Mi();
                case IPHONE:
                    return new IPhone();
                default:
                    return new MOTO();
            }
        }
    }

    public void testSimpleFactory() {
        PhoneFactory factory = new PhoneFactory();
        Phone mi = factory.createPhone(PhoneBrand.MI);
        Phone moto = factory.createPhone(PhoneBrand.MOTO);
        Phone iPhone = factory.createPhone(PhoneBrand.IPHONE);
        DPConstants.PRTMsg(" mi is " + mi + " moto is: " + moto + " iPhone is: " + iPhone);
    }

    public interface InnerDPFactory {
        Phone createPhone(PhoneBrand brand);

        PC createPC(PCBrand brand);
    }

    public static class AbstractDPFactoryImpl implements InnerDPFactory {
        PhoneFactory phonef = new PhoneFactory();

        @Override
        public Phone createPhone(PhoneBrand brand) {
            return phonef.createPhone(brand);
        }

        @Override
        public PC createPC(PCBrand brand) {
            switch (brand) {
                case MICROSOFT:
                    return new Mirosoft();
                default:
                    return new Lenovo();
            }
        }
    }

    public void testAbstractFactory() {
        AbstractDPFactoryImpl factoryImpl = new AbstractDPFactoryImpl();
        DPConstants.PRTMsg("AbstractDPFactoryImpl produce phone: " + factoryImpl.createPhone(PhoneBrand.MI).brand()
                + " pc is : " + factoryImpl.createPC(PCBrand.LENOVO).brand());
    }
}

总结

工厂模式在框架内使用时很好用的,factory 模板代码可以产生意想不到的效果,啥效果,就是可以非常自然的去使用目标产物而不用关心构造的细节,并且还有一个很神奇的功效就是 只要接口稳定在工厂里面换具体实现类是很自然的事情,这样就能达到外部根本无感知,但是通过工厂我们达到了偷梁换柱的升级效果,代码越写越好,由于这个模式的存在用户基本上就是无痛插入,太强了。