生成器是一种专门负责创建对象的类,实际上这是工厂方法设计模式的一种应用, 当时用生成器创建对象时,它不需要任何参数,而工厂方法一般需要参数。
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