抽象工厂+反射


  • 抽象产品类
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();
//        }

    }
}

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,001评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,779评论 18 399
  • 多态 任何域的访问操作都将有编译器解析,如果某个方法是静态的,它的行为就不具有多态性 java默认对象的销毁顺序与...
    yueyue_projects阅读 994评论 0 1
  • 有些代码是伪代码,运行不起来。 一、概述 抽象工厂:ProductA 和 ProductB 都是两个抽象的产品,之...
    Mitchell阅读 1,108评论 0 1
  • 对象的创建与销毁 Item 1: 使用static工厂方法,而不是构造函数创建对象:仅仅是创建对象的方法,并非Fa...
    孙小磊阅读 2,031评论 0 3