自定义生成器

生成器,是一种专门负责创建对象的类,它不同于工厂方法,它创建对象时,它不需要任何参数,这里生成器将会设计利用了泛型。

//生成器接口
public interface Generator <T>
{
    T next();
}
//公共父类
public class Coffee 
{
  private static long counter = 0;
  //标记每个子类的标识值
  private final long id = counter++;
  public String toString() 
  {
    return getClass().getSimpleName() + " " + id;
  }
} 
//子类
public class Latte extends Coffee {}
public class Mocha extends Coffee {}
public class Cappuccino extends Coffee {}
public class Americano extends Coffee {}
public class Breve extends Coffee {}
//编一个随机生成器实现生成器和迭代器接口
public class CoffeeGenerator implements Generator<Coffee>,Iterable<Coffee>
{
    //要随机生成的这些对象
    @SuppressWarnings("rawtypes")
    private Class[] type={Latte.class,Mocha.class,Cappuccino.class,Americano.class,Breve.class};
    private  static Random random=new Random(47);
    //迭代次数
    private int size=0; 
    public CoffeeGenerator(int size)
    {
        super();
        this.size = size;
    }   
    public CoffeeGenerator()
    {
        super();
    }
    @Override
    public Iterator<Coffee> iterator()
    {
        return new CofferIterator();
    }
    //返回一个随机产生的对象
    @Override
    public Coffee next()
    {       
        try
        {
            return (Coffee)type[random.nextInt(type.length)].newInstance();
        } catch (Exception e)
        {
            throw new RuntimeException(e);
        } 
    }
    //内部类的迭代器
    class CofferIterator 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()
        {
            throw new UnsupportedOperationException();          
        }       
    }
    public static void main(String[] args)
    {
        CoffeeGenerator generator=new CoffeeGenerator();
        //用循环创建对象
        for(int i=0;i<5;i++)
            System.out.println(generator.next());
         //利用迭代器创建对象
        for(Coffee c:new CoffeeGenerator(5))
            System.out.println(c);
    }
}

运行结果:
Americano 0
Latte 1
Americano 2
Mocha 3
Mocha 4
Breve 5
Americano 6
Latte 7
Cappuccino 8
Cappuccino 9

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
-----------------更新说明----------------- 1.1.2: 支持所有的按键,特殊键也可以直接设置,不用复制到连发键设置框。 取消F12这个热键开关,改为左右WIN键,而且屏蔽了这2个键,按了不会弹出的,变成开关,原来的Scroll Lock不变。 1.1.1: 解决个别杀毒软件误报的现象,原因是由于UPX压缩引起的。 UPX压缩的好处是生成的连发工具体积非常小,只有200KB+,不压缩有400KB+。 生成时加入对话框由用户自行决定是否用UPX压缩(以往默认使用UPX压缩,所以误报很正常)。 右键菜单加入热键。 1.1.0: 解决在关闭连发的情况下所有按键都不正常的BUG,优化了脚本,效率提高,(请务必更新)。 该BUG的表现:按住还能连发(速度慢),有时候随便按个键还按不出(按键不正常)。 修改版本号的形式为X.X.X,菜单加入英文单词提示。 -----------------使用说明----------------- 连发不是连招。。。连发的意思是按下一个键不放就自动连按该键,比如按下X键不放就实现自动攻击,比手动按要快得多,节省力气,还能减少键盘寿命o(∩_∩)o...,至于效果怎么样自己测试吧。 设置自己的连发键: 下载好之后运行 SET_AHK.exe 然后设置你要连发的按键,比如X键,然后点增加,然后点生成连发,就会在目录下面生成一个新文件: DNF_AHK.exe DNF_AHK.exe 可以单独运行的,你可以复制该文件到其他地方保存起来,SET_AHK.exe文件不需要了,当然了,要修改按键必须要用它。 如何使用连发工具: 运行上面生成好的 DNF_AHK.exe 就可以了,工具首次运行自动判断 Scroll Lock 键,会直接开启连发。注意:指示灯亮就表示开启,如果要打字就再按次Scroll Lock键,指示灯关闭就表示关闭连发功能,打字完再按次Scroll Lock键保持连发的开启状态,1.1.2以后版本增加连发热键开关:左右WIN键。 -----------------调整延时方法(非必须)----------------- 第一次运行建议先设置你的键盘延时,这样效果会更加好,当然你也可以不设置,一样可以用本连发工具,而且速度也很快: 直接运行 SetInterval.bat 文件(该文件只有在运行SET_AHK.exe的状态下才生成),点确定导入注册表即可。 这一步其实可以这样操作:控制面板---键盘---重复延时--短 托到最右边的短那里,然后重启电脑就可以了,本工具自带的注册表原理一样的,只是用 SetInterval.bat 弄好之后就可以不重启电脑直接生效,方便网吧用户。 该连发工具基于AutoHotkey核心制作而成。 Vista和WIN7系统请以系统管理员身份运行连发工具,否则可能无法连发,也请大家测试下这些系统是否能用。 56q.5d6d.com 离不开电脑制作

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值