一个创建Bean对象的工厂

* Bean:在计算机英语中,有可重用组件的含义
* JavaBean:用java语言编写的可重用组件。
*      javabean >  实体类
*
*   它就是创建我们的service和dao对象的。
*
*   第一个:需要一个配置文件来配置我们的service和dao
*           配置的内容:唯一标识=全限定类名(key=value)
*   第二个:通过读取配置文件中配置的内容,反射创建对象
*
*   我的配置文件可以是xml也可以是properties







bean.properties

accountService=com.itheima.service.impl.AccountServiceImpl
accountDao=com.itheima.dao.impl.AccountDaoImpl

BeanFactory.java

package com.itheima.factory;import java.io.InputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;public class BeanFactory {//定义一个Properties对象private static Properties props;//定义一个Map,用于存放我们要创建的对象。我们把它称之为容器private static Map<String,Object> beans;//使用静态代码块为Properties对象赋值static {try {//实例化对象props = new Properties();//获取properties文件的流对象InputStream in = BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");props.load(in);//实例化容器beans = new HashMap<String,Object>();//取出配置文件中所有的KeyEnumeration keys = props.keys();//遍历枚举while (keys.hasMoreElements()){//取出每个KeyString key = keys.nextElement().toString();//根据key获取valueString beanPath = props.getProperty(key);//反射创建对象Object value = Class.forName(beanPath).newInstance();//把key和value存入容器中beans.put(key,value);}}catch(Exception e){throw new ExceptionInInitializerError("初始化properties失败!");}}/*** 根据bean的名称获取对象* @param beanName* @return*/public static Object getBean(String beanName){return beans.get(beanName);}/*** 根据Bean的名称获取bean对象* @param beanName* @returnpublic static Object getBean(String beanName){Object bean = null;try {String beanPath = props.getProperty(beanName);
//            System.out.println(beanPath);bean = Class.forName(beanPath).newInstance();//每次都会调用默认构造函数创建对象}catch (Exception e){e.printStackTrace();}return bean;}*/
}

IAccountDao.java

package com.itheima.dao;/*** 账户的持久层接口*/
public interface IAccountDao {/*** 模拟保存账户*/void saveAccount();
}

AccountDaoImpl.java

package com.itheima.dao.impl;import com.itheima.dao.IAccountDao;/*** 账户的持久层实现类*/
public class AccountDaoImpl implements IAccountDao {public  void saveAccount(){System.out.println("保存了账户");}
}

IAccountService.java

package com.itheima.service;/*** 账户业务层的接口*/
public interface IAccountService {/*** 模拟保存账户*/void saveAccount();
}

AccountServiceImpl.java

package com.itheima.service.impl;import com.itheima.dao.IAccountDao;
import com.itheima.factory.BeanFactory;
import com.itheima.service.IAccountService;/*** 账户的业务层实现类*/
public class AccountServiceImpl implements IAccountService {//    private IAccountDao accountDao = new AccountDaoImpl();private IAccountDao accountDao = (IAccountDao)BeanFactory.getBean("accountDao");//    private int i = 1;public void  saveAccount(){int i = 1;accountDao.saveAccount();System.out.println(i);i++;}
}

Client.java

package com.itheima.ui;import com.itheima.factory.BeanFactory;
import com.itheima.service.IAccountService;/*** 模拟一个表现层,用于调用业务层*/
public class Client {public static void main(String[] args) {//IAccountService as = new AccountServiceImpl();for(int i=0;i<5;i++) {IAccountService as = (IAccountService) BeanFactory.getBean("accountService");System.out.println(as);as.saveAccount();}}
}

曾经案例中问题 与 工厂模式解耦相关推荐

  1. 【Spring】工厂模式解耦

    问题: 程序的耦合    耦合:程序间的依赖关系    包括:类之间的依赖       方法之间的依赖 解耦:降低程序之间的耦合关系    实际开发:编译期不依赖,运行期才依赖    解耦思路:    ...

  2. Spring学习(2)-程序间耦合和工厂模式解耦

    程序的耦合及解耦 本文目录 程序的耦合及解耦 1.什么是程序的耦合 2.解决程序耦合的思路 3.工厂模式解耦 4.控制反转-Inversion Of Control 5.使用 spring 的 的 I ...

  3. Java中的简单工厂模式(转)

    Java中的简单工厂模式 举两个例子以快速明白Java中的简单工厂模式: 女娲抟土造人 话说:"天地开辟,未有人民,女娲抟土为人."女娲需要用土造出一个个的人,但在女娲造出人之前, ...

  4. 设计模式中几个工厂模式的比较——餐馆的故事

    初读 Learning Hard大神的作品(C#设计模式总结 - Learning hard - 博客园),略有感触.对创建型模式中的简单工厂模式.工厂方法模式和抽象工厂模式这三个既有共性又有区别的模 ...

  5. [Head First设计模式]饺子馆(冬至)中的设计模式——工厂模式

    系列文章 [Head First设计模式]山西面馆中的设计模式--装饰者模式 [Head First设计模式]山西面馆中的设计模式--观察者模式 [Head First设计模式]山西面馆中的设计模式- ...

  6. 将小部分源码设计精髓带入到开发中来(工厂模式、适配器模式、抽象类、监听器)

    前言 咋说呢,大学期间阅读过很多源码(Aop.Mybatis.Ioc.Spring Mvc-),刚开始看这些源码的时候觉得云里雾里,一个没什么代码量的人突然去接触这种商业帝国级别的成品源码的时候,根本 ...

  7. 工厂模式解耦---控制反转

    控制反转 是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度.其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫"依赖查找&q ...

  8. PHP框架中的设计模式-工厂模式(简单工厂)|Simple Factory Pattern-ThinkPHP v3.2

    一. ThinkPHP简单工厂模式应用~之~根据数据库连接配置参数设定相应的数据库驱动类? 比如说当数据库类型'DB_TYPE'配置为'mysql',则ThinkPHP会自动建立MySQL的数据库连接 ...

  9. 工厂设计模式(java版本、spring源码中使用的工厂模式)

    最近在学习spring源码,发现在IoC容器初始化的时候创建各种bean,然后在代码中看到各种beanFactory和factoryBean,很显然spring容器在创建bean的过程是使用了工厂设计 ...

最新文章

  1. windows下php7.1安装redis扩展以及redis测试使用全过程
  2. 10个利用Eclipse调试Java的常见技巧
  3. 使用前端框架Foundation 4来帮助简化响应式设计开发
  4. java handlersocket_HandlerSocket java客户端
  5. python 函数定义位置_PYTHON--函数定义
  6. LPC1788 Fatfs读写U盘操作
  7. JAVA前后端分离项目脚手架
  8. linux 文件隐藏,Linux系统怎么隐藏文件夹和文件?
  9. 使用python把普通图片生成ico图标
  10. 2.jQuery常见API
  11. ATK-DTU-M750 物联网模块+MQTT(阿里云)配置(一)
  12. 电路设计之--滤波电容选取
  13. 从从协方差的误差椭圆到PCA
  14. 雾计算和边缘计算有什么区别
  15. java斜椭圆_JAVA 任意椭圆方向画法
  16. Android程序员面试必备的知识点,Android程序员
  17. python基于PHP+MySQL的连锁商店仓库管理系统
  18. 搜狗和QQ 拼音输入法,如何输入拼音的音调ā ō è ì ǔ ǘ
  19. 企业开源治理案例及开源项目列表
  20. 「Unity3D」解决2022的PackageManager无法显示官方插件Burst和Collections的最新版本

热门文章

  1. BrowserSync前端同步测试工具
  2. 电脑新安装JDK版本并运行使用该JDK版本问题
  3. C语言之随机数和字符串输入输出
  4. 个人学习进度(第十三周)
  5. Mac安装PhoneGap3
  6. SQL Server 2012中的ColumnStore Index尝试
  7. make的常见错误信息
  8. Java实现的简单的WebService服务发布和Client调用例子
  9. 谈谈ogre中级教程中例子与appwizard冲突
  10. 小猿圈html5教程之canvas绘制线段方法