工厂模式:就是建立对象都放在工厂来完成。
注册工厂:就是把这些工厂全部放在一个List里面去,然后循环调用工厂动态的建立对象
一个父类有许多子类
1、现在想自动建立子类的对象,哪怎么办?2、 使用工厂模式,每个子类里有个建立自己对象的工厂,(也可以使用其它方式实现)
3、然后父类直接把每个子类的工厂:放入自己 List 里面。
package ftypeinfo.factory;
public interface Factory<T> { //T就是子类
T create();
}
package ftypeinfo;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import ftypeinfo.factory.Factory;
class Part{
public String toString(){
return getClass().getSimpleName(); //对象里的方法子类都可以用。
}
/**<? extends Part>:? 表示Part的子类。
* <Factory<Part的子类>>
* 表示List里面放的是Factory的实现类。
* FuelFilter:Part的子类
* Factory,FuelFilter里面的内部类。
*/
static List<Factory<? extends Part>> partFactories=
new ArrayList<Factory<? extends Part>>();
static { //建立子类的Factor 对象
partFactories.add(new FuelFilter.Factor()); //可以添加多个子类工厂对象。
}
private static Random rand=new Random(47);
// 建立子类对象
public static Part createRandom()
{
int n=rand.nextInt(partFactories.size());
return partFactories.get(n).create(); //从List选取建立实例
}
}
class Filter extends Part{}
class FuelFilter extends Filter{
public static class Factor implements ftypeinfo.factory.Factory<FuelFilter>
{
@Override
public FuelFilter create() {
// TODO Auto-generated method stub
return new FuelFilter();
}}
}
public class RegisteredFactories {
public static void main(String[] args) {
// TODO Auto-generated method stub
/**
* Part.createRandom()这个方法调用表示Part执行,
*首先初始化Part 类的 static 块。
* 初始化静态类。
*/
for(int i=0;i<10;i++)
System.out.println(Part.createRandom());
}
}