由歌词引发的模式思考之下篇(模拟Spring的BeanFactory)
前两篇阐述了FactoryMethod和AbstractFactory的实现以及类结构图,但是正如大家所知道的那样,没有任何事情是完美的,这两种设计模式也有自己的优缺点,而Spring对两种工厂模式取长补短,很好的解决了关于生产的产品维度以及产品系列维度问题。
三、FactoryMethod与AbstractFactory对比
FactoryMethod与AbstractFactory对比:
FactoryMethod主要是生产产品,为产品维度,缺点是生产产品系列时,易导致工厂泛滥。AbstractFactory主要是产品系列,为产品系列维度,缺点是生产产品品种时,工厂改动比较大,不灵活。
四、模拟Spring的BeanFactory的实现
1 public interface Moveable { 2 void run(); 3 }
1 public class Car implements Moveable{ 2 public void run() { 3 System.out.println("car run"); 4 } 5 }
1 public class Train implements Moveable{ 2 public void run() { 3 System.out.println("train run"); 4 } 5 }
1 public interface BeanFactory { 2 Object getBean(String id); 3 }
1 public class ClassPathXmlApplicationContext implements BeanFactory { 2 private Map<String,Object> container = new HashMap<String,Object>(); 3 /** 4 * 采用JDom解析applicationContext.xml 5 * 具体包可以网上下载 6 * @param fileName 7 * @throws JDOMException 8 * @throws IOException 9 * @throws InstantiationException 10 * @throws IllegalAccessException 11 * @throws ClassNotFoundException 12 */ 13 public ClassPathXmlApplicationContext(String fileName) throws JDOMException, IOException, InstantiationException, IllegalAccessException, ClassNotFoundException { 14 SAXBuilder sb = new SAXBuilder(); 15 Document doc = sb.build(this.getClass().getResourceAsStream(fileName)); 16 Element root = doc.getRootElement(); 17 List list = XPath.selectNodes(root, "/beans/bean"); 18 // System.out.println(list.size()); 19 20 for(int i=0; i<list.size(); i++) { 21 Element bean = (Element) list.get(i); 22 String id = bean.getAttributeValue("id"); 23 String clazz = bean.getAttributeValue("class"); 24 Object o = Class.forName(clazz).newInstance(); 25 container.put(id, o); 26 // System.out.println(" id: " + id + " class: " + clazz); 27 } 28 } 29 @Override 30 public Object getBean(String id) { 31 return container.get(id); 32 } 33 34 }
1 <!--Spring配置文件applicationContext.xml--> 2 <?xml version="1.0" encoding="UTF-8"?> 3 <beans> 4 <bean id="v" class="com.learn.www.factory.spring.Car"> 5 </bean> 6 </beans>
1 public class Test { 2 3 /** 4 * @param args 5 * @throws IOException 6 * @throws ClassNotFoundException 7 * @throws IllegalAccessException 8 * @throws InstantiationException 9 * @throws JDOMException 10 */ 11 public static void main(String[] args) throws IOException, InstantiationException, IllegalAccessException, ClassNotFoundException, JDOMException { 12 BeanFactory f = new ClassPathXmlApplicationContext("applicationContext.xml"); 13 Object o = f.getBean("v"); 14 Moveable m = (Moveable)o; 15 m.run(); 16 } 17 18 }
所以对Spring给大家一个比较基础的认识就是Spring是一个Bean工厂,一个IOC容器,要求面向接口,面向抽象编程,把具体的东西都配置在配置文件中,以适应灵活的需求变动。
感谢马老师的学习资料,让我可以深入的学习Java。
转载于:https://www.cnblogs.com/iou123lg/archive/2013/04/14/3021229.html
由歌词引发的模式思考之下篇(模拟Spring的BeanFactory)相关推荐
- 由歌词引发的模式思考之上篇(FactoryMethod模式)
"老张开车去东北 撞了 肇事司机耍流氓 跑了 多亏一个东北人 送到医院缝五针 好了 --翠花,上酸菜" "老张开车去东北",OK,这里如果我们刻意的用OO思想来 ...
- 游戏破解引发盈利模式思考
最近公司两款游戏在国内大型论坛发现破解版,让我们一直感觉遥远的"版权"问题瞬间来到身边,使我们措手不及,我们还是按照正常流程跟论坛发邮件删除该贴,支持国内原创游戏.2天时间内发现2 ...
- 增长的旋律——AARRR模式思考(二)
作者:livan 来源:数据python战算法 前情介绍 上一篇文章:增长的旋律--AARRR模式思考(一),介绍了AARRR模型中的"Acquisition获取用户&q ...
- GitChat 被恶意攻击引发的技术性思考:拒绝服务攻击
本文来自作者 肖志华 在 GitChat 上分享 「GitChat 被恶意攻击引发的技术性思考:拒绝服务攻击」,「阅读原文」查看交流实录. 「文末高能」 编辑 | 哈比 拒绝服务的类型很多,挑几个有特 ...
- 常见软件项目开发模式思考
一.软件项目 在2000左右 程序员还是一种比较罕见的工作,那是的个人台式机还是当时富裕家庭的高级娱乐用品,一开始网络程序员部分前后端,PHP.JSP.ASP这些技术形成了最早的网络程序.BS 系统 ...
- NSObject到底多么大引发的一些思考
NSObject到底多么大引发的一些思考 本文引用及参考文献,感谢一下博主的分享: C++ 内存对齐-by enos 小码哥iOS学习笔记第一天: Objective-C的本质-by 冰凌天 Obje ...
- 关于“找老婆”问题引发的深入思考
浅谈"数学家.理论计算机科学家.工程师的区别" 关于"找老婆"问题引发的深入思考 有一天,三个朋友一起去吃烧烤.他们分别是数学家,理论计算机科学家,计算机工程师 ...
- 幽灵代码删库跑路引发的分支模式思考
Photo @ Akshar Dave 文 | 故知 背景--讲个真实的"鬼"故事 菜鸟 CTO 线研发效能团队开发了一个大促协同平台,来提高大家在处理大促相关工作时的协同效 ...
- 制造业产品开发中应用敏捷Scrum的思考 (下篇)
上篇作者作为一名机械制造业的从业者,简单介绍了敏捷Scrum,并分享了一些对Scrum理念的理解.下篇以制造业产品开发中应用敏捷Scrum的思考进行了一系列的分享. 点击链接阅读: 敏捷Scrum理念 ...
最新文章
- Hibernate **关于hibernate4.3版本之后org.hibernate.service.ServiceRegistryBuilder被弃用**
- UnicodeEncodeError: ‘locale‘ codec can‘t encode character ‘\u5e74‘ in position 2: Illegal byte seque
- java 图像采集_JAVA B/S通过摄像头采集图片信息解决方案。
- 16个Linux服务器监控命令
- MOCTF-火眼金睛
- ios 直播点赞_微信新版本更新:为视频号直播虚拟礼物,还提供连麦、美颜等功能...
- 用mescroll实现无限上拉增加数据,下拉刷新数据 (学习笔记)
- 学了java然后深入_JAVA8学习——从源码角度深入Stream流(学习过程)
- latex加下划线_给latex文字加下划线和高亮显示
- 免费企业邮箱注册申请免费吗?哪个好用
- PL/SQL Oracle恢复默认界面设置
- Android使用XML做动画UI
- 四色菊皇家大学 SiSaKet Rajabhat University (SSKRU)
- 《女神异闻录5》那套酷炫界面的背后,是18年来的始终如一
- 7-5 3824经典游戏分数 20 作者 李佳单位 重庆大学
- 【随笔】方波的表示、转换与应用
- KindEditor编辑器结合EasyUi
- linux安装sqlserver
- Load balancer does not have available server for client: wr-fac
- 金三银四求职季,前端面试题小梳理(HTML、CSS、JS)
热门文章
- Gemini论文笔记
- CF-1023F.Mobile Phone Network(并查集缩点)
- TCP滑动窗口和拥塞控制机制
- c++三五法则(适合学完一遍不怎么清楚的童鞋)
- C++STL中swap函数操作与内存地址改变的简析
- mysql 出现错误 Duplicate entry for key PRIMARY 解决办法
- 用户不见了_03 | 为什么你设计的信息用户总是看不见
- 鸢尾花分类_K近邻(分类通用 数据挖掘入门与实践-实验4)
- C 语言 常见数据类型解析
- Android-NDK:native-media