传统工厂模式在实际开发中根本用不到,问题就在于new。每增加一个接口的子类就要修改工厂类,如果要解决关键字new带来的问题,最好的办法就是通过反射来处理,因为Class类可以使用newInstance()实例化对象,同时Class.forname()能够接收类名称
案例一:水果工厂
package com.bit.reflect; import static java.lang.Class.forName; public interface IFruit { public void eat(); } class Apple implements IFruit{ @Override public void eat() { System.out.println("吃苹果" ); } } class Orange implements IFruit{ @Override public void eat() { System.out.println("吃橘子"); } } class FruitFactory{ private FruitFactory(){} public static IFruit getFruit(String className){ IFruit fruit = null; try { fruit = (IFruit) Class.forName(className).newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return fruit; } } package com.bit.reflect; import java.util.Date; public class TestDemo { public static void main(String[] args) { IFruit fruit = FruitFactory.getFruit("com.bit.reflect.Apple"); fruit.eat(); } }案例二:有⼀天,刘同学准备去买笔记本,他到商城发现有两款电脑他特别喜欢, 一款是 Macbook Pro, 另⼀款 是 Surface Pro。
package com.bit.reflect; public interface IComputer { public void printComputer(); } class MacbookProComputer implements IComputer{ @Override public void printComputer() { System.out.println("This is a MacbookPro"); } } class SurfaceBookComputer implements IComputer{ @Override public void printComputer() { System.out.println("This is a SurfaceBook"); } } class ComputerFactory{ private ComputerFactory(){}; public static IComputer getComputer(String className){ IComputer computer = null; try { computer = (IComputer) Class.forName(className).newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return computer; } } public class TestDemo{ public static void main(String[] args) { IComputer computer = ComputerFactory.getComputer("com.bit.reflect.MacbookProComputer"); computer.printComputer(); } }