定义一个用于创建对象的接口,让子类决定实例化哪一个类
工厂方法使一个类的实例化延迟到其子类
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);
}
}