反射+抽象工厂改进,就是将简单工厂用抽象工厂改进的switch语句部分获取对象方式替换,修改成用反射的方法获取对象,,先上UI类图

这里我们以经典的小案例,造车案例讲述。车企有宝马,大众,比亚迪,每个厂商都能生产油车,电车,混合车。这里因此各继承各抽象的类,实现各自的造车的方法即可。这里简单,不在阐述,主要是反射部分。由于反射这里的作用主要是为了解决由于switch语句违反开放封闭的设计原则,而删掉以后增加各类灵活性会变差的问题。因此这里通过反射获取。而反射获取核心的难点在于获取类名需要路径,ForName部分,这里是采用IO流的方式向文件里输入,然后通过键值对的方式有效的获取。代码如下

反射造车部分,通过以此获取具体想要创建车企的对象

public class CreateCarBrandFactory {public CreateCarBrandFactory() {}public Object CreateCarBrandFactory(String brand,String carType) throws InstantiationException, IllegalAccessException, ClassNotFoundException, IOException{return  Class.forName(new Config1("CreateCar.properties").outValue(brand)+".impl."+new Config1("CreateCar.properties").outValue(carType)).newInstance();}}

IO流读出和写入文件部分,以此完成对配置文件的读入写出操作

public class Config1 {String propertiesName;public Config1(String propertiesName){this.propertiesName=propertiesName;}//在配置文件中写入键值对public void inData(String key,String value,String comments) throws IOException {//创建properties对象,以用于写入配置文件Properties props=new Properties();FileOutputStream oFile = new FileOutputStream(propertiesName,true);props.setProperty(key, value);props.store(oFile,comments);oFile.close();}//读取配置文件中的键值对public String outValue(String key1) throws IOException{Properties props=new Properties();FileInputStream iFile=new FileInputStream(propertiesName);props.load(iFile);iFile.close();return props.getProperty(key1);}
}

最后客户端调用函数,进行测试

  public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException, FileNotFoundException, IOException {//初始化配置文件Config1 config = new Config1("CreateCar.properties");config.inData("大众油车", "VMOidCar","VM");config.inData("宝马油车", "BMWOidCar","BMW");config.inData("大众","VMCar", "VM");config.inData("宝马","BMWCar", "BMW");Scanner scan=new Scanner(System.in);System.out.println("请输入车的品牌");String brand=scan.next();System.out.println("请输入购买车的类型");String type=scan.next();Car create=(Car)new CreateCarBrandFactory().CreateCarBrandFactory(brand,(brand+type));if(create==null){System.out.println("该汽车不存在");return;}String s = create.OidCar();System.out.println(s);}

运行结果如下

项目结果图

反射+抽象工厂改进经典案例相关推荐

  1. 重构机房收费系统总结1之配置文件+反射+抽象工厂

    在重构机房收费系统之前就一直听说这次重构要用反射+配置文件.深远的作用不知道,可是在这次重构用到,目的还是挺明白的:就是为了更换数据时方便,遵循开放-封闭原则.攻克了可维护和可扩展的问题. 以下就以机 ...

  2. 反射 + 抽象工厂模式切换不同的实现方法

    概述 工厂模式(Abstract Factory)定义 :提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂模式(Abstract Factory Pattern)是围绕一 ...

  3. 使用反射+抽象工厂的数据访问(1)

    应用程序有时需要适应于不同的数据库,例如要将一个Access数据库的网站改成使用Sql Server数据库.由于SQL Server和Access在ADO.Net上的使用是不同的,SQL Server ...

  4. 设计模式之抽象工厂(抽象工厂 + 反射 + 配置文件)

    目录 1.抽象工厂的概念 ​2.抽象工厂的结构图 3.抽象工厂设计模式的练习示例 4.抽象工厂设计模式的练习示例结构图 5. 抽象工厂 + 反射 + 配置文件 5.1:什么是java的反射机制? 5. ...

  5. 设计模式之四(抽象工厂模式第三回合)

    原文:设计模式之四(抽象工厂模式第三回合) 前言 抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂模式最大的好处便是易于交换产品系列,由于具体工厂类,例如I ...

  6. 工厂模式 工厂方法模式 抽象工厂模式 简单工厂模式 工厂模式于抽象工厂的区别 设计模式

    工厂模式 定义一个用于创建对象的接口,让子类实现具体类的创建.工厂将类的实例化延迟的子类. 良好的分装性.对于具体产品,只要知道产品名称即可(类名或字符串),封闭了对产品创建的细节. 屏蔽具体产品类. ...

  7. 设计模式-抽象工厂模式的应用场景及Java中对抽象工厂的应用

    1. 什么是抽象工厂模式 抽象工厂模式提供了一个创建一系列相关或者相互依赖对象的接口,无需指定他们的类 抽象工厂模式(Abstract Factory Pattern)隶属于设计模式中的创建型模式,用 ...

  8. C#之三十九 抽象工厂模式

    在软件系统中,经常面临着"一系列相互依赖的对象"的创建工作:同时由于需求的变化,往往存在着更多系列对象的创建工作.如何应对这种变化?如何绕过常规的对象的创建方法(new),提供一种 ...

  9. 设计模式之工厂方法模式、抽象工厂模式的概念和实现及使用“反射技术+读取配置文件”的方法对工厂模式进行改进(软件工程综合实践课程第三周个人作业)

    文章目录 一.实验目的 二.知识总结 1.工厂方法模式简介 2.抽象工厂模式简介 3.工厂模式小结 4.利用"反射技术+读取配置文件"的方法改进程序 三.实验内容 1. 工厂模式实 ...

最新文章

  1. python升级和安装pip
  2. 开发常见错误解决(3)VS2005调试程序出错,绑定句柄无效 Terminal Services
  3. 专家:香港拥有人民币资产配置独特优势
  4. js小案例:定时轮播图
  5. 为什么EClipse不显示错误
  6. 在Solaris系统下如何更改网络配置?
  7. xp怎么删除计算机用户,谁了解xp系统如何删除工作组计算机
  8. SAP License:四类业务四类工厂
  9. JavaScript之面向对象与原型笔记整理--------创建对象之原型(2)
  10. 大数据延长了乔布斯8年寿命?它其实还有更多潜力
  11. [转载]Git安装以及使用Git 管理个人文档
  12. 线性同余法[纯理论]
  13. ABAQUS2017帮助文档查看_51CAE_新浪博客
  14. python socket服务端
  15. 学习日记 | 云计算 - 服务模型 - 三层架构(深度学习)
  16. 把你的 Mac 从 Catalina 降级回 Mojave 系统的避坑指南
  17. mysql查询并计算单价_Mysql--查询的成本如何计算
  18. IE无法打开网页的问题
  19. 高通SDX62平台 MBIM搜网、查询信号等功能异常
  20. 多因素身份认证之手机推送认证

热门文章

  1. Python学习.iloc和.loc区别、联系与用法
  2. 使用matplotlib给女朋友画一个爱心吧,这份满满的爱意,一定要记得收下
  3. SIGKILL和SIGTERM、SIGINT
  4. 《CCNA路由和交换(200-120)学习指南》——2.2节OSI参考模型的各层
  5. captcha 验证码调用方法
  6. RAII技术与智能指针(超详细)
  7. avcodec_receive_frame始终返回EAGAIN
  8. 数据库死锁分析与解决
  9. JAVA利用海明距离测算文本相似度
  10. oracle增加表字段、修改表字段、删除表字段