静态工厂设计模式:
public interface IBook {
public void print();
}
public class MathBook implements IBook{
@Override
public void print() {
System.out.println("我是数学书");
}
}
public class EnglishBook implements IBook{
@Override
public void print() {
System.out.println("我是英语书");
}
}
public class OtherBook implements IBook{
@Override
public void print() {
System.out.println("我是其它类型的书");
}
}
public class BookFactory {
public static IBook getInstance(String bookName) {
if ("com.bing.demo.MathBook".equals(bookName)) {
return new MathBook();
} else if ("com.bing.demo.EnglishBook".equals(bookName)) {
return new EnglishBook();
} else {
return new OtherBook();
}
}
}
测试类:
public class Test {
public static void main(String[] args) throws Exception {
IBook book = BookFactory.getInstance("com.bing.demo.EnglishBook");
book.print();
}
}
打印日志:
我是英语书
动态工厂设计模式:(因为不可能我们每一个Ibook字类都要在factory中添加一个if else,所以我们通过反射来实现动态实例化),修改上面的BookFactory代码:
public class BookFactory {
public static IBook getInstance(String bookName) throws
ClassNotFoundException, NoSuchMethodException,
IllegalAccessException, InvocationTargetException,
InstantiationException {
//通过反射获得当前class文件
Class<?> clazz = Class.forName(bookName);
Constructor<?> constructor = clazz.getConstructor();
return (IBook) constructor.newInstance();;
}
}
测试类:
public class Test {
public static void main(String[] args) throws Exception {
IBook book = BookFactory.getInstance("com.bing.demo.MathBook");
book.print();
}
}
打印结果:
我是数学书
因为动态工厂可能返回空值,所以我们使用Optional工具类来控制,确保我们在测试类中得到的数据不为空,如果报空指针异常,那一定是factory的问题:
public class BookFactory {
public static Optional<IBook> getInstance(String bookName) throws
ClassNotFoundException, NoSuchMethodException,
IllegalAccessException, InvocationTargetException,
InstantiationException {
//通过反射获得当前class文件
Class<?> clazz = Class.forName(bookName);
Constructor<?> constructor = clazz.getConstructor();
return Optional.of((IBook) constructor.newInstance());
}
}
测试类:
public class Test {
public static void main(String[] args) throws Exception {
//通过get方法从Optional中取值
IBook book = BookFactory.getInstance("com.bing.demo.OtherBook").get();
book.print();
}
}
打印结果:
我是其它类型的书