package pkg.book; //工厂主要生产物品的抽象接口(该工厂主要生产书本) public interface Book { public String name(); public int TotalPages(); public double price(); }
package pkg.book; //工厂生产数学书 public class MathBook implements Book{ @Override public int TotalPages() { return 200; } @Override public String name() { return "Math Book"; } @Override public double price() { return 17.5; } }
package pkg.book; //工厂生产英语书 public class EnglishBook implements Book{ @Override public int TotalPages() { return 153; } @Override public String name() { return "English Book"; } @Override public double price() { return 23.2; } }
import pkg.book.Book; //利用了Java的反射机制来创造对象 public class Factory { //Class<? extends Book> 表示Class的泛型是全部继承自Book,所以所有的Book子类都可以传给Class<? extends Book> c public static Book create(Class<? extends Book> c) { Book book = null; try { System.out.println("ClassName: "+c.getName()); //创建对象 book = (Book)Class.forName(c.getName()).newInstance(); } catch (Exception e) { System.err.println("error to create book!"); } return book; } }
import pkg.book.EnglishBook; import pkg.book.MathBook; public class Main { //测试类 public static void main(String[] args) { //直接通过XXX.class将类传入工厂 System.out.println(Factory.create(MathBook.class).name()); System.out.println(Factory.create(EnglishBook.class).name()); } }
运行结果:
ClassName: pkg.book.MathBook Math Book ClassName: pkg.book.EnglishBook English Book
工厂方法相比与简单工厂显得更加的严整,而且工厂自身的创建新对象的方法变得很简单.
客户端只需要指定一下自己想要创建的类,就可以让工厂去生产了。
主要是Java的反射机制利用.
项目源码地址:http://www.kuaipan.cn/file/id_132802506211221471.htm?source=1