设计模式之工厂方法(Factory Method)

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

原文地址:https://www.cnblogs.com/vokie/p/3602097.html