把Thinking in java 中的一个示例整合的改写了一下,其中也涉及到泛型的一点知识:
package factoryinfo;
import java.util.*;
interface Factory<T> {
T create();
}
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());
partFactories.add(new PowerSteeringBelt.Factory());
partFactories.add(new GeneratorBelt.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 factoryinfo.Factory<FuelFilter>{
public FuelFilter create(){
return new FuelFilter();
}
}
}
class AirFilter extends Filter{
public static class Factory implements factoryinfo.Factory<AirFilter>{
public AirFilter create(){
return new AirFilter();
}
}
}
class CabinAirFilter extends Filter{
public static class Factory implements factoryinfo.Factory<CabinAirFilter>{
public CabinAirFilter create(){
return new CabinAirFilter();
}
}
}
class OilFilter extends Filter{
public static class Factory implements factoryinfo.Factory<OilFilter>{
public OilFilter create(){
return new OilFilter();
}
}
}
class Belt extends Part{}
class FanBelt extends Belt{
public static class Factory implements factoryinfo.Factory<FanBelt>{
public FanBelt create(){
return new FanBelt();
}
}
}
class GeneratorBelt extends Belt{
public static class Factory implements factoryinfo.Factory<GeneratorBelt>{
public GeneratorBelt create(){
return new GeneratorBelt();
}
}
}
class PowerSteeringBelt extends Belt{
public static class Factory implements factoryinfo.Factory<PowerSteeringBelt>{
public PowerSteeringBelt create(){
return new PowerSteeringBelt();
}
}
}
public class RegisteredFactories {
/**
* Method main
*
*
* @param args
*
*/
// TODO:
public static void main(String[] args){
for(int i=0;i<10;i++){
System.out.println(Part.createRandom());
}
}
}