反射+抽象工厂改进经典案例
反射+抽象工厂改进,就是将简单工厂用抽象工厂改进的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之配置文件+反射+抽象工厂
在重构机房收费系统之前就一直听说这次重构要用反射+配置文件.深远的作用不知道,可是在这次重构用到,目的还是挺明白的:就是为了更换数据时方便,遵循开放-封闭原则.攻克了可维护和可扩展的问题. 以下就以机 ...
- 反射 + 抽象工厂模式切换不同的实现方法
概述 工厂模式(Abstract Factory)定义 :提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂模式(Abstract Factory Pattern)是围绕一 ...
- 使用反射+抽象工厂的数据访问(1)
应用程序有时需要适应于不同的数据库,例如要将一个Access数据库的网站改成使用Sql Server数据库.由于SQL Server和Access在ADO.Net上的使用是不同的,SQL Server ...
- 设计模式之抽象工厂(抽象工厂 + 反射 + 配置文件)
目录 1.抽象工厂的概念 2.抽象工厂的结构图 3.抽象工厂设计模式的练习示例 4.抽象工厂设计模式的练习示例结构图 5. 抽象工厂 + 反射 + 配置文件 5.1:什么是java的反射机制? 5. ...
- 设计模式之四(抽象工厂模式第三回合)
原文:设计模式之四(抽象工厂模式第三回合) 前言 抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂模式最大的好处便是易于交换产品系列,由于具体工厂类,例如I ...
- 工厂模式 工厂方法模式 抽象工厂模式 简单工厂模式 工厂模式于抽象工厂的区别 设计模式
工厂模式 定义一个用于创建对象的接口,让子类实现具体类的创建.工厂将类的实例化延迟的子类. 良好的分装性.对于具体产品,只要知道产品名称即可(类名或字符串),封闭了对产品创建的细节. 屏蔽具体产品类. ...
- 设计模式-抽象工厂模式的应用场景及Java中对抽象工厂的应用
1. 什么是抽象工厂模式 抽象工厂模式提供了一个创建一系列相关或者相互依赖对象的接口,无需指定他们的类 抽象工厂模式(Abstract Factory Pattern)隶属于设计模式中的创建型模式,用 ...
- C#之三十九 抽象工厂模式
在软件系统中,经常面临着"一系列相互依赖的对象"的创建工作:同时由于需求的变化,往往存在着更多系列对象的创建工作.如何应对这种变化?如何绕过常规的对象的创建方法(new),提供一种 ...
- 设计模式之工厂方法模式、抽象工厂模式的概念和实现及使用“反射技术+读取配置文件”的方法对工厂模式进行改进(软件工程综合实践课程第三周个人作业)
文章目录 一.实验目的 二.知识总结 1.工厂方法模式简介 2.抽象工厂模式简介 3.工厂模式小结 4.利用"反射技术+读取配置文件"的方法改进程序 三.实验内容 1. 工厂模式实 ...
最新文章
- python升级和安装pip
- 开发常见错误解决(3)VS2005调试程序出错,绑定句柄无效 Terminal Services
- 专家:香港拥有人民币资产配置独特优势
- js小案例:定时轮播图
- 为什么EClipse不显示错误
- 在Solaris系统下如何更改网络配置?
- xp怎么删除计算机用户,谁了解xp系统如何删除工作组计算机
- SAP License:四类业务四类工厂
- JavaScript之面向对象与原型笔记整理--------创建对象之原型(2)
- 大数据延长了乔布斯8年寿命?它其实还有更多潜力
- [转载]Git安装以及使用Git 管理个人文档
- 线性同余法[纯理论]
- ABAQUS2017帮助文档查看_51CAE_新浪博客
- python socket服务端
- 学习日记 | 云计算 - 服务模型 - 三层架构(深度学习)
- 把你的 Mac 从 Catalina 降级回 Mojave 系统的避坑指南
- mysql查询并计算单价_Mysql--查询的成本如何计算
- IE无法打开网页的问题
- 高通SDX62平台 MBIM搜网、查询信号等功能异常
- 多因素身份认证之手机推送认证