定义一个用于创建对象的接口,让子类决定实例化哪一个类 工厂方法使一个类的实例化延迟到其子类
example1:
public interface Human { public void color(); public void talk(); } public class BlackHuman implements Human { @Override public void color() { // TODO Auto-generated method stub System.out.println("The skin color is black."); } @Override public void talk() { // TODO Auto-generated method stub System.out.println("Black human is talking."); } } public class YellowHuman implements Human { @Override public void color() { // TODO Auto-generated method stub System.out.println("The skin color is yellow."); } @Override public void talk() { // TODO Auto-generated method stub System.out.println("Yellow human is talking."); } } public abstract class AbstractHumanFactory { public abstract <T extends Human> T createHuman(Class<T> c); } /** * * 定义一个用于创建对象的接口,让子类决定实例化哪一个类 * 工厂方法使一个类的实例化延迟到其子类 * */ public class HumanFactory extends AbstractHumanFactory{ public <T extends Human> T createHuman(Class<T> c){ Human human = null; try{ human = (T)Class.forName(c.getName()).newInstance(); }catch(Exception e){ System.out.println(e.getMessage()); } return (T)human; } }
public class Client { public static void main(String[] args){ AbstractHumanFactory absHumanFactory = new HumanFactory(); Human blackHuman = absHumanFactory.createHuman(BlackHuman.class); blackHuman.color(); blackHuman.talk(); } }
example2:
public abstract class Product { public void method1(){ } public abstract void method2(); } public class ConcreteProduct1 extends Product { @Override public void method2() { } } public abstract class Creator { public abstract <T extends Product> T createProduct(Class<T> c); } public class ConcreteCreator extends Creator{ public <T extends Product> T createProduct(Class<T> c){ Product product = null; try { product = (Product)Class.forName(c.getName()).newInstance(); } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } return (T)product; } } public class ProductClient { public static void main(String[] args) { // TODO Auto-generated method stub Creator creator = new ConcreteCreator(); Product product = creator.createProduct(ConcreteProduct1.class); } }