本文共 1954 字,大约阅读时间需要 6 分钟。
采用工厂的思维,其实就是利用工厂对象来创建需要的对象,为了方便创建对象,即一个工厂可以创建多个同一类型的对象。要实现此种效果,就得抽取这些对象的共同属性和方法建立抽象成父类或者接口,在工厂类中利用多态,即父类或接口引用指向子类对象。
1.首先创建一个水果工厂(父类)接口:
package factory;public interface Fruit { public void getFruit() ;}
2.然后我们创建水果(子类)来实现这些接口:
package factory;public class Apple implements Fruit{ @Override public void getFruit() { System.out.println("生产苹果"); } }
package factory;public class Banner implements Fruit{ @Override public void getFruit() { System.out.println("生产香蕉"); }}
3.最后我们来创建一个水果工厂,用来创建水果实例:
package factory;public class FruitFactory { //定义一个静态方法 public static Fruit CreatFruit(String fruit){ if(fruit.equalsIgnoreCase("apple")) { return new Apple(); }else if(fruit.equalsIgnoreCase("banner")) { return new Banner(); }else { return null; } }}
4.创建一个测试类:
package factory;public class Test { public static void main(String[] args) { Fruit apple = FruitFactory.CreatFruit("apple"); Fruit banner = FruitFactory.CreatFruit("banner"); apple.get(); banner.get(); }}
但是这种静态工厂的缺点显而易见,我生产两种水果就需要写三个if、else判断语句,如果生产 1000 种水果就需要 1001 个if、else语句这显然是很没有效率的。为此,我们可以用反射的方式对它进行一些优化。
5.用反射进行优化工厂方法:
package factory;public class FruitFactory { //定义一个静态方法 @SuppressWarnings("deprecation") public static Fruit CreatFruit(String fruit) throws Exception{ Class clazz = Class.forName(fruit); return (Fruit)clazz.newInstance(); }}
为此,对应的调用方法也要更改:
package factory;public class Test { public static void main(String[] args) throws Exception { Fruit apple = FruitFactory.CreatFruit("factory.Apple"); Fruit banner = FruitFactory.CreatFruit("factory.Banner"); apple.get(); banner.get(); }}
有同学可能发现了,使用反射需要全限定类名,那么写那么多全限定类名是不是太累了?对的,对这种全限定类名,可以使用一个常量类将其设置为常量,或是使用配置文件,这样是不是很方便?
转载地址:http://wzprn.baihongyu.com/