zoukankan      html  css  js  c++  java
  • 利用泛型接口实现生成器

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

    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
    

      

  • 相关阅读:
    网格模型和X文件使用面面观(转)
    3D中的OBJ文件格式详解(转载)
    机器学习随笔01
    WinForm ListControl MouseWheel Envent
    如何判断一个元素在亿级数据中是否存在? 很难吗...
    windows 虚拟机VMware 安装linux系统注意事项!!!
    windows phpinfo上不能找到memcache扩展 php版本5.6
    php 判断两个时间段是否有交集
    tp5.0 根据经纬度 获取附近信息
    php 前台生成多维数组 后台批量添加
  • 原文地址:https://www.cnblogs.com/E-star/p/3436435.html
Copyright © 2011-2022 走看看