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



经验分享 程序员 微信小程序 职场和发展