生成器是一种专门负责创建对象的类,实际上这是工厂方法设计模式的一种应用, 当时用生成器创建对象时,它不需要任何参数,而工厂方法一般需要参数。
import java.util.Iterator; import java.util.Random; //一般来说一个生成器只定义一个方法,该方法用以产生新的对象 interface Generator<T> { public T next(); } //一个继承体系 class Coffee { private static long counter = 0; private final long id = counter++; @Override public String toString() { return getClass().getName() + " " + id; } } class Latte extends Coffee{} class Macha extends Coffee{} class Breve extends Coffee{} //生成器类 public class CoffeeGenerator implements Generator<Coffee>, Iterable<Coffee>{ private int size; private Class[] types = {Latte.class, Macha.class, Breve.class}; private static Random random = new Random(47); public CoffeeGenerator() {} public CoffeeGenerator(int size) { this.size = size; } //实现Iterable 重写Iterator方法,是的我们可以利用foreach语法访问 class CoffeeIterator implements Iterator<Coffee> { int count = size; @Override public boolean hasNext() { return count > 0; } @Override public Coffee next() { count--; return CoffeeGenerator.this.next(); } @Override public void remove() { // TODO Auto-generated method stub } } @Override public Iterator<Coffee> iterator() { // TODO Auto-generated method stub return new CoffeeIterator(); } //重写生成器的next方法 @Override public Coffee next() { Coffee result = null; try { result = (Coffee)types[random.nextInt(types.length)].newInstance(); //利用Class对象随机生成Coffee对象 } catch (InstantiationException | IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } return result; } public static void main(String[] args) { CoffeeGenerator generator = new CoffeeGenerator(); for (int i = 0; i < 5; ++i) { System.out.println(generator.next()); } System.out.println("------------分割---------------"); for (Coffee c : new CoffeeGenerator(5)) { System.out.println(c); } } } 输出: Breve 0 Breve 1 Macha 2 Breve 3 Macha 4 ------------分割--------------- Breve 5 Macha 6 Breve 7 Latte 8 Macha 9