抽象工厂+反射

2017-07-25  本文已影响0人  Mrko0630

public abstract class AbstractProduct {
    abstract void method();
}
public class ProductOne extends AbstractProduct {
    @Override
    void method() {
        System.out.println("Product ONE");
    }
}
public class ProductTwo extends AbstractProduct {
    @Override
    void method() {
        System.out.println("Product TWO");
    }
}
public abstract class AbstractFactory {
//       public abstract AbstractProduct Product(String type);
       public abstract <T extends AbstractProduct> T Product(Class<T> tClass);
}
public class SpecificFactory extends AbstractFactory {
    //通过映射拿到Class的Instance、
    @Override
    public <T extends AbstractProduct> T Product(Class<T> tClass) {
        AbstractProduct product=null;
        try {
            product=(AbstractProduct) tClass.forName(tClass.getName()).newInstance();
        }catch (Exception e){
            e.printStackTrace();
        }

        return (T) product;
    }
//    原始的需要传类型过来进行判断生产那种产品
//    @Override
//    public AbstractProduct Product(String type) {
//       if ("ProductOne".equalsIgnoreCase(type)){
//           return new ProductOne();
//       }else if ("ProductTwo".equalsIgnoreCase(type)){
//           return new ProductTwo();
//       }else {
//          System.out.println("type is unknow");
//           return null;
//       }
//    }
}

Client客户端调用

public class MyClass {
    public static void main(String[] args ){
        AbstractFactory factory=new SpecificFactory();
        AbstractProduct productOne=factory.Product(ProductOne.class);
        if (productOne!=null) {
            productOne.method();
        }
        AbstractProduct productTwo=factory.Product(ProductTwo.class);
        if (productTwo!=null){
            productTwo.method();
        }
 //       此处为原始传值区分生产那种产品(非空判断么、null pointer 多、你懂得、、)
//        AbstractFactory factroy=new SpecificFactory();
//        AbstractProduct productOne=factroy.Product("ProductOne");
//        if (productOne!=null){
//        productOne.method();
//        }
//        AbstractProduct productTwo=factroy.Product("ProductTwo");
//        if (productTwo!=null){
//            productTwo.method();
//        }

    }
}

注:注释部分为对比代码、

上一篇下一篇

猜你喜欢

热点阅读