Java设计模式:注册工厂
注册工厂:
当我们要随机创建多个不同父类的子类时,我们可以用工厂方法设计模式结合泛型实现。
静态初始化器只有在类首次被加载的时候才能被调用,因此碰上了先有鸡还是先有蛋的问题:生成器在其列表中不包含这个类,因此不能创建这个类的对象,而这个类也就不能被加载并置于这个列表中。 使用工厂方法设计模式,将对象的创建工作交给类自己去完成。工厂方法可以被多态调用,从而为你创建适当类型的对象。本方法中,工厂方法就是Factory接口中的create()方法。
package com.aijie.typeinfo.factory; /** * @author E-mail: * @version 2018年6月2日 下午6:23:22 */ public interface Factory<T>{ T create(); }
package com.aijie.typeinfo.factory; import java.util.*; /** * @author E-mail: * @version 2018年6月2日 下午6:26:08 * 在本例中,Filter和Belt只是分类标识,因此不能创建它们的实例,而只应该创建它们子类的实例。 */ class Part{ public String toString(){ return getClass().getSimpleName(); } static List<Factory<? extends Part>> partFactories = new ArrayList<Factory<? extends Part>>(); static { partFactories.add(new FuelFilter.Factory()); partFactories.add(new AirFilter.Factory()); partFactories.add(new CabinAirFilter.Factory()); partFactories.add(new OilFilter.Factory()); partFactories.add(new FanBelt.Factory()); } private static Random rand = new Random(47); public static Part createRandom(){ int n = rand.nextInt(partFactories.size()); return partFactories.get(n).create(); } } class Filter extends Part{} class FuelFilter extends Filter{ public static class Factory implements com.aijie.typeinfo.factory.Factory<FuelFilter>{ public FuelFilter create(){ return new FuelFilter(); } } } class AirFilter extends Filter{ public static class Factory implements com.aijie.typeinfo.factory.Factory<AirFilter>{ public AirFilter create(){ return new AirFilter(); } } } class CabinAirFilter extends Filter{ public static class Factory implements com.aijie.typeinfo.factory.Factory<CabinAirFilter>{ public CabinAirFilter create(){ return new CabinAirFilter(); } } } class OilFilter extends Filter{ public static class Factory implements com.aijie.typeinfo.factory.Factory<OilFilter>{ public OilFilter create(){ return new OilFilter(); } } } class Belt extends Part{} class FanBelt extends Belt{ public static class Factory implements com.aijie.typeinfo.factory.Factory<FanBelt>{ public FanBelt create(){ return new FanBelt(); } } } public class RegisteredFactories { public static void main(String[] args) { for(int i=0;i<10;i++) System.out.println(Part.createRandom()); } }
OilFilter FuelFilter OilFilter AirFilter AirFilter FanBelt OilFilter FuelFilter CabinAirFilter CabinAirFilter