由于在使用泛型的时候,将会擦除类型参数,而只保留原始类型。所以在使用泛型时,我们不能使用new T(),也不能使用instanceof, 因为这两类操作要知道确切的类型。此问题的解决方案有三种(设计模式的使用):简单工厂(最简单),工厂方法(最灵活),模板方法(最简捷)。
1.简单工厂
在此方法中,将类型作为参数,以一个万能的工厂类(其中有一个返回具体类型类的实例的泛型方法)用类的newInstance()方法返回参数化类型的实例,如下所示:
优点:简单,直接使用泛型方法
缺点:
(1)单一使用Class对象的newInstance()方法只能使用默认的构造器,使得对象的创建有限制。
(2)若一个具体的类无默认的构造器,则会抛出异常。
2.工厂方法
与简单工厂方法相比,工厂方法加入了如下几个元素:
(1)工厂接口/抽象接口—具体工厂公共的接口/类型
(2)具体工厂—–由具体工厂负责具体产品的创建,且其必须保证产品的成功的创建,在具体工厂中可调用各种各样的构造方法,因为具体工厂中已将参数化类型具体化。
(3)工厂管理类——由此类可负责何种类型具体工厂的创建并可返回具体工厂的实例。
优点:加入了上述三个元素后,解决了以下问题:
1)所有的具体工厂拥有共同的接口
2)具体工厂保证了具体产品的成功创建:可调用任意的构造方法生成具体类的实例
3)工厂管理类:对具体工厂的生成拥有控制权,使具体工厂的生成具有了灵活性。
工厂方法的实现如下:
1)抽象工厂
2)AuthorFactory:负责Author实例的创建
3)IntegerFactory:负责Integer实例的创建
3)工厂管理类(泛型类):FactoryManage
4)测试客户端
补充:具体的Author类
3.模板方法
以更加简捷的方法生成具体类的实例。与工厂方法不同的地方在于:用模板类(抽象类)来控制整个实例化过程的流程(有点像工厂管理类,由模板方法控制整体流程,而具体创建过程由其子类实现),而由具体类来完成具体产品的构建。但在具体生成类的实例时,我还是用到了工厂的概念,但其只作为一个具体的实现而已。最大的优点:简捷,因为直接调用具体的生成类即可,并且模板类是隐藏的,对客户透明的(而工厂方法中管理类工厂要显式地生成)。
3.1模板类
3.2具体模板类AuthorCreator
3.3具体模板类:IntegerCreator
3.4客户端测试