package com.learn.spring;/*** 这个Factory模拟Spring,我把它改成interface* Spring的意思是这样的,当你拿到任何的具体的子类的时候,* * @author Leon.Sun**/
public interface BeanFactory {/*** 它里面有一个方法叫做getBean* 每个bean有自己的一个名字*/Object getBean(String id);
}
package com.learn.spring;/*** 作为Car来说,他实现了Moveable接口,* Moveable里面有一个run,* @author Leon.Sun**/
public class Car implements Moveable {public void run() {System.out.println("冒着烟奔跑中car......");}}
package com.learn.spring;public interface Moveable {void run();}
package com.learn.spring;import java.util.Properties;public class Test {public static void main(String[] args) throws Exception {/*** 在java.util里面有一个Propertie* 总而言之这个Properties是读配置文件的*/Properties props = new Properties();/*** 我们需要的是一个InputStream,这个InputStream怎么读,* 由于我现在把Spring.properties是放在source里面,* 所以他编译之后会放在bin里面,也就是会放在项目的classpath里面,* 总而言之你要知道他可以把配置文件读出来,先学脉络,load什么?* 站在Java虚拟机的角度,每一个class的类load到内存之后,* 都会当成一个Class对象,getClassLoader就拿到装载这个对象那个类装载器* 然后他有一个方法getResourceAsStream,这句话是说你把这个文件当做InputStream* 也就是当做可以读进来的流来给他拿过来,注意他的类路径在根上,你要写清楚了* 把这个文件当做InputStream,把它转换成一个Properties对象,* 转换成对象之后,他这个文件里面缩写的配置文件的信息,VehicleType这个就会被称之为key,* com.learn.spring.Car这个就被称之为value* * 如果我想改成别的产品简单,比如我改成Train,我只要改这么一个地方* 就变成小火车..... 你发现我只要直接改配置文件,我从配置文件拿到的具体的类型就已经发生了改变* */props.load(Test.class.getClassLoader().getResourceAsStream("com/learn/spring/spring.properties"));/*** 他的类的名字* 左边的那个是key,* 如果你看的还是不太清就打印一下*/String vehicleTypeName = props.getProperty("VehicleType");/*** com.learn.spring.Car* 你可以发现这样可以读取配置文件的信息* 读到这个信息之后,注意我拿到的是一个字符串,* 我想把这个字符串所代表的这个类给他产生一个新对象出来,* 我们要用到JAVA的反射机制*/System.out.println(vehicleTypeName);/*** Class.forName的意思是把这个字符串所代表的这个类给他load到内存,* 大家知道JAVA的程序要想运行,首先会把Class文件load到内存,装载到内存,* 装载到内存只是把Class文件装载到内存,但是他并没有产生这个类的对象,* 产生这个类的对象用newInstance,会调用他参数为空的构造方法,* 所以你只要保证这个参数为空的构造方法就行了,这时候它会产生一个新对象* 产生的新对象是Object类型,你要想用的话把他强制转化为Moveable类型*/Object o = Class.forName(vehicleTypeName).newInstance();/*** 把他强制转换为Moveable类型*/Moveable m = (Moveable)o;m.run();             /*** Spring的意思是说,你不要再new这个Car了* 具体new什么你写在配置文件里面吧* 你要想new Car就new Car,想new别的就new别的* Car和Train实现了Moveable接口,* 就不要在这里new了,我们能不能写在配置文件里面,* 答案是可以的,我先写一种配置文件,JAVA里面有一种最常见的配置文件* 在Test里面我new什么是根据配置文件来定的,这就不行了吗,* 这个东西具体怎么写,*/// Moveable m = new Car();// m.run();}}
package com.learn.spring;public class Train implements Moveable {@Overridepublic void run() {System.out.println("小火车....");}}
VehicleType=com.learn.spring.Train

设计模式之_工厂系列_03相关推荐

  1. 设计模式之_工厂系列_01

    package com.learn.factory;import java.util.ArrayList; import java.util.List;/*** 他现在new的是Car,* * 在这里 ...

  2. 设计模式之_工厂系列_02

    package com.learn.abstractfactory;/*** 现在我们假设这么一个东西,这个人不仅开着车,* 还拿着武器,比如说他拿着一把AK47,* 这个人不仅开着Car,手持AK4 ...

  3. 设计模式之_动态代理_03

    我们假设被代理的对象实现了一个接口,不管它实现了什么样的接口,但是它实现了一个接口,用集成也可以实现代理,但是继承不好,所以我们被代理的类要实现一个接口,这个在Spring也是这么要求的,不过Spri ...

  4. 设计模式练习_设计练习是邪恶的

    设计模式练习 It was the final round of interviews. Or, so the candidate thought. 这是采访的最后一轮. 或者,所以候选人认为. Sh ...

  5. java设计模式 观察者模式_理解java设计模式之观察者模式

    在生活实际中,我们经常会遇到关注一个事物数据变化的情况,例如生活中的温度记录仪,当温度变化时,我们观察它温度变化的曲线,温度记录日志等.对于这一类问题,很接近java设计模式里面的"观察者模 ...

  6. 设计模式之_动态代理_01

    package com.learn.proxy;import java.util.Random;/*** 产生了坦克这么一个类* 坦克当然是可以移动的,实现了接口,实现了move方法* 我想知道一个方 ...

  7. python 设计模式 观察者_设计模式Python实现-观察者模式

    观察者模式(发布-订阅模式 Publish Subscribe Pattern):定义了一种一对多的关系,让多个观察对象同时监听一个主题对象,当主题对象状态发生变化时会通知所有观察者,是它们能够自动更 ...

  8. 设计模式示例_责任链设计模式示例

    设计模式示例 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此重要的原因 ...

  9. 设计模式示例_代理设计模式示例

    设计模式示例 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此重要的原因 ...

最新文章

  1. 191127注意事项
  2. python过滤敏感词
  3. “智能经济”浪潮下,百度为何强调“人格化”与“服务化”?
  4. “此图片来自微信公众平台 未经允许不可引用“ 解决办法
  5. linux mysql 静态库_Linux静态库与动态库实例详解
  6. Redis发布订阅和Stream
  7. linux文件比较,合并,查找重复行
  8. python解析库 爬虫_Python 爬虫 解析库的使用 --- XPath
  9. Linux数据链路层的包解析
  10. 关于Chrome浏览器书签被更改的分析
  11. python 进化树_物种进化树构建
  12. 3500字专家访谈,探访汽车零部件企业争相迈步数字化背后的故事
  13. UiPath Excel 复制粘贴
  14. Python ---------列表 集合 字典 深浅拷贝
  15. 没有安全删除硬件的解决
  16. pytorch中的神经网络模块基础类——torch.nn.Module
  17. 递归与lamdba与高阶函数
  18. 密码爆破工具:Medusa(美杜莎)-操作说明hydra-操作说明
  19. 为什么只有奇次谐波_什么是奇次谐波和偶次谐波?_学小易找答案
  20. 实验吧-杂项-MD5之守株待兔(时间戳python时间戳函数time.time())

热门文章

  1. Linux而不必进入password登陆自己主动sshserver方法
  2. android之frame动画详解
  3. 有一个1,2,3....49 的数组,通过控制台显示为7行7列的,并且里面的数据时随机的代码...
  4. Silverlight-Visifire图表使用示例发布时空白页面的解决办法
  5. [HDU 1015] Safecracker
  6. 要玩转这个星际争霸II开源AI,你只需要i5+GTX1050
  7. Jenkins+Gradle+Git自动打apk包,并上传到ftp
  8. 2017云栖大会·杭州峰会:《在线用户行为分析:基于流式计算的数据处理及应用》之《数据可视化:构建实时动态运营数据分析大屏》篇...
  9. 搭建本地的git仓库
  10. java 路径的故事