前两篇阐述了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)相关推荐

  1. 由歌词引发的模式思考之上篇(FactoryMethod模式)

    "老张开车去东北 撞了 肇事司机耍流氓 跑了 多亏一个东北人 送到医院缝五针 好了 --翠花,上酸菜" "老张开车去东北",OK,这里如果我们刻意的用OO思想来 ...

  2. 游戏破解引发盈利模式思考

    最近公司两款游戏在国内大型论坛发现破解版,让我们一直感觉遥远的"版权"问题瞬间来到身边,使我们措手不及,我们还是按照正常流程跟论坛发邮件删除该贴,支持国内原创游戏.2天时间内发现2 ...

  3. 增长的旋律——AARRR模式思考(二)

         作者:livan      来源:数据python战算法 前情介绍 上一篇文章:增长的旋律--AARRR模式思考(一),介绍了AARRR模型中的"Acquisition获取用户&q ...

  4. GitChat 被恶意攻击引发的技术性思考:拒绝服务攻击

    本文来自作者 肖志华 在 GitChat 上分享 「GitChat 被恶意攻击引发的技术性思考:拒绝服务攻击」,「阅读原文」查看交流实录. 「文末高能」 编辑 | 哈比 拒绝服务的类型很多,挑几个有特 ...

  5. 常见软件项目开发模式思考

    一.软件项目 在2000左右 程序员还是一种比较罕见的工作,那是的个人台式机还是当时富裕家庭的高级娱乐用品,一开始网络程序员部分前后端,PHP.JSP.ASP这些技术形成了最早的网络程序.BS 系统 ...

  6. NSObject到底多么大引发的一些思考

    NSObject到底多么大引发的一些思考 本文引用及参考文献,感谢一下博主的分享: C++ 内存对齐-by enos 小码哥iOS学习笔记第一天: Objective-C的本质-by 冰凌天 Obje ...

  7. 关于“找老婆”问题引发的深入思考

    浅谈"数学家.理论计算机科学家.工程师的区别" 关于"找老婆"问题引发的深入思考 有一天,三个朋友一起去吃烧烤.他们分别是数学家,理论计算机科学家,计算机工程师 ...

  8. 幽灵代码删库跑路引发的分支模式思考

    Photo @  Akshar Dave 文  |  故知 背景--讲个真实的"鬼"故事 菜鸟 CTO 线研发效能团队开发了一个大促协同平台,来提高大家在处理大促相关工作时的协同效 ...

  9. 制造业产品开发中应用敏捷Scrum的思考 (下篇)

    上篇作者作为一名机械制造业的从业者,简单介绍了敏捷Scrum,并分享了一些对Scrum理念的理解.下篇以制造业产品开发中应用敏捷Scrum的思考进行了一系列的分享. 点击链接阅读: 敏捷Scrum理念 ...

最新文章

  1. Hibernate **关于hibernate4.3版本之后org.hibernate.service.ServiceRegistryBuilder被弃用**
  2. UnicodeEncodeError: ‘locale‘ codec can‘t encode character ‘\u5e74‘ in position 2: Illegal byte seque
  3. java 图像采集_JAVA B/S通过摄像头采集图片信息解决方案。
  4. 16个Linux服务器监控命令
  5. MOCTF-火眼金睛
  6. ios 直播点赞_微信新版本更新:为视频号直播虚拟礼物,还提供连麦、美颜等功能...
  7. 用mescroll实现无限上拉增加数据,下拉刷新数据 (学习笔记)
  8. 学了java然后深入_JAVA8学习——从源码角度深入Stream流(学习过程)
  9. latex加下划线_给latex文字加下划线和高亮显示
  10. 免费企业邮箱注册申请免费吗?哪个好用
  11. PL/SQL Oracle恢复默认界面设置
  12. Android使用XML做动画UI
  13. 四色菊皇家大学 SiSaKet Rajabhat University (SSKRU)
  14. 《女神异闻录5》那套酷炫界面的背后,是18年来的始终如一
  15. 7-5 3824经典游戏分数 20 作者 李佳单位 重庆大学
  16. 【随笔】方波的表示、转换与应用
  17. KindEditor编辑器结合EasyUi
  18. linux安装sqlserver
  19. Load balancer does not have available server for client: wr-fac
  20. 金三银四求职季,前端面试题小梳理(HTML、CSS、JS)

热门文章

  1. Gemini论文笔记
  2. CF-1023F.Mobile Phone Network(并查集缩点)
  3. TCP滑动窗口和拥塞控制机制
  4. c++三五法则(适合学完一遍不怎么清楚的童鞋)
  5. C++STL中swap函数操作与内存地址改变的简析
  6. mysql 出现错误 Duplicate entry for key PRIMARY 解决办法
  7. 用户不见了_03 | 为什么你设计的信息用户总是看不见
  8. 鸢尾花分类_K近邻(分类通用 数据挖掘入门与实践-实验4)
  9. C 语言 常见数据类型解析
  10. Android-NDK:native-media