在分析工厂模式之前,我们先看看普通模式下的Java三层结构。

Controller(表现层)-Service(业务层)-Dao(持久层、数据库连接层),基于此三层结构完成JavaWeb相关业务。

假设我们要完成的业务是添加员工信息,

先创建Dao包,创建EmpDao接口和EmpDaoFactory实现类。Dao包结构.pngpackage com.yd.dao;

/**

* 员工模块Dao(持久层)接口

*

*/

public interface EmpDao {

// 添加员工信息

public void addEmp();

}package com.yd.dao;

/**

* 员工模块Dao(持久层)接口实现类

*

*/

public class EmpDaoImpl implements EmpDao{

public void addEmp() {

System.out.println("Dao层的addEmp()方法执行了..");

}

}

再创建Service包,创建EmpService接口和EmpServiceImpl实现类,在实现类中创建Dao接口的子类对象,这样做是程序之间的耦合性上升。

package com.yd.service;

/**

* 员工模块的service(业务层)接口

*

*/

public interface EmpService {

// 添加员工信息

public void addEmp();

}package com.yd.service;

import com.yd.dao.EmpDao;

import com.yd.dao.EmpDaoImpl;

/**

* 员工模块的service(业务层)接口实现类

*

*/

public class EmpServiceImpl implements EmpService{

//调用Dao接口的子类对象

//new对象使程序之间的耦合性上升

private EmpDao dao=new EmpDaoImpl();

public void addEmp() {

System.out.println("调用dao层的方法添加员工信息");

}

}

最后创建controller包,在包中创建EmpController类package com.yd.controller;

import org.junit.Test;

import com.yd.service.EmpService;

import com.yd.service.EmpServiceImpl;

/**

* 模拟表现层

* controller-> service-> dao

*

*/

public class EmpController {

/**

* 获取service接口的子类实例

* new对象造成程序耦合性上升

*/

//EmpService成员变量手动属性注入,属性注入了一个EmpServiceImpl对象。

private EmpService service=new EmpServiceImpl();

@Test

public void testAddEmp() {

System.out.println("调用service层的方法添加员工信息");

service.addEmp();

}

}

我们可以发现,在EmpServiceImpl类中创建了EmpDaoImp类的对象,两个类之间的耦合性上升;在EmpController类中创建了EmpSericeImpl对象,两个类之间的耦合性上升。

直接new对象使程序的耦合性上升,为日后的维护升级带来麻烦。

工厂方式解耦,完美解决了模块之间的耦合性过高的问题。

工厂模式,顾名思义,就是建立一个对象工厂,利用工厂来创建每个实现类的对象。就像工厂生产手机、电脑等工业品一样,这个工厂什么对象都能造!

在改造以上代码之前,先了解一些概念。

bean:可重用组件

JavaBean:java语言编写的可重用组件,例如service层,dao层,Controller层。

bean分为业务bean和实体bean。

业务bean:处理业务逻辑,service层和Dao层

实体bean:封装数据,相当于mvc设计模式的model、POJO,自己编写的Emp实体类。

如何解耦?提供配置文件,在配置文件中配置service和dao的实现类

通过工厂读取配置文件中的全限定类名,利用反射创建对象,如.properties和.xml文件

改造上面的代码,第一步:创建一个Factory包和BeanFatory类。

package com.yd.Factory;

import java.io.IOException;

import java.io.InputStream;

import java.util.Properties;

public class BeanFactory {

//声明一个Properties对象,在静态代码块中初始化

private static Properties prop;

static {

//prop实例化

prop = new Properties();

//获取配置流对象,得到配置文件的内容

InputStream inputStream = BeanFactory.class.getClassLoader().getResourceAsStream("config.properties");

try {

//将配置文件中的内容读到Prop对象中

prop.load(inputStream);

} catch (IOException e) {

e.printStackTrace();

throw new RuntimeException("初始化properties对象失败");

}

}

/**

* 根据config.xml文件中的key获取对应的class类实例

* @param key

* @return bean

*/

public static Object getBean(String key) {

Object bean=null;

try {

//得到key对应的value值,并创建对象

String className = prop.getProperty(key);

bean = Class.forName(className).newInstance();

} catch (Exception e) {

e.printStackTrace();

}

return bean;

}

}

在以上代码中,首先声明了properies类的对象prop,利用反射机制(ClassName.class)和ClassLoader类加载器中的getResourceAsStream(),将配置文件以流的形式读取出来,prop加载此流的信息,读取到配置文件。

prop对象根据传入key获取对应的value,value就是类的全限定类名,根据此类名利用反射机制创建想要对象。并返回给调用者。

第二步:在根目录下创建config.properies文件EmpService=com.yd.service.EmpServiceImpl

EmpDao=com.yd.dao.EmpDaoImpl

第三步:在EmpController类中添加如下代码//工厂方式解耦

//获取Service接口的子类实例

private EmpService service=(EmpService) BeanFactory.getBean("EmpSerice");

//获取Dao接口的子类实例

private EmpDao empDao=(EmpDao) BeanFactory.getBean("EmpDao");

@Test

public void testAddEmp() {

System.out.println("工厂方式调用service层的方法添加员工信息");

service.addEmp();

}

工厂模式本质就是利用Java的反射机制和ClassLoader类加载器,为开发者提供一个创建类的统一接口。开发者只需要调用Beanfactory(),配合.properties文件,就能创建实例,调用方法。

基于工厂模式,大佬和高手开发出了强大的工具spring和springboot,spring以IOC(Inverse Of Control:控制反转)和AOP(Aspact Oriented Programming:面向切面编程)为核心,整合开源世界的大多数第三方框架,成为使用最多的JavaEE企业应用开源框架。

spring的本质就是管理程序的对象,即创建对象和维护对象之间的关系。

java 对象工厂_Java设计模式之--工厂方式相关推荐

  1. 格力电器Java面试题_JAVA设计模式学习--工厂模式

    今天谈一下对工厂模式学习的总结. 看完视频和文章之后要自己表述工厂模式,总是感觉无从说起,不知道怎么去定义工厂模式,反复看了几遍之后终于理解一点. 自己理解工厂模式是通过这两种模式的特点来理解和定义的 ...

  2. java工厂方法_Java设计模式之工厂方法模式

    2.工厂方法模式 <设计模式之禅>中用神话故事女娲造人来比概述工厂方法模式. 女娲采集黄土捏成人的形状,然后放到八卦炉中烧制,最后放置到大地上生长,工艺过程是没有错的,但是意外随时都会发生 ...

  3. java 设计模式 路由器_java设计模式2————工厂模式

    java设计模式2----工厂模式 1.工厂模式介绍: 1.1.实现了创建者与调用者的分离 1.2.详细分类: 简单工厂模式 工厂方法模式 抽象工厂模式 1.3.所遵循的OOP原则: 开闭原则:对扩展 ...

  4. java工厂模式静态工厂_Java设计模式之静态工厂模式详解

    本文实例讲述了Java设计模式之静态工厂模式.分享给大家供大家参考,具体如下: 静态工厂模式(static factory)也叫简单工厂模式. 涉及到3个角色:工厂类角色,抽象产品类角色和具体产品类角 ...

  5. java web简单工厂模式_JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)

    在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一 ...

  6. java 抽象工厂工厂_Java设计模式之简单工厂、工厂方法和抽象工厂

    学习Java的同学注意了!!! 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:456544752我们一起学Java! 在前面的学习中(参见前面的博客),我们学到了很 ...

  7. java 工厂模式详解_Java设计模式之工厂模式详解

    简单工厂其实并不是设计模式,只是一种编程习惯. 首先我们创建父类Cup,所有杯子类的父类.再创建它的子类BigCup和SmallCup类. public abstract class Cup { pu ...

  8. java抽象工厂模式_JAVA设计模式-抽象工厂模式

    定义 抽象工厂(AbstractFactory)模式的定义:是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构. 抽象工厂模 ...

  9. java 反射抽象_Java实现抽象工厂模式+java的反射的机制

    Java的反射机制: JAVA反射机制是就是运行的状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法 ...

最新文章

  1. R构建lasso回归模型并获得最佳正则化系数
  2. 2020十大热门机器学习项目
  3. Image Generation
  4. docker-compose 安装mysql
  5. 基于Flume的美团日志收集系统(二)改进和优化
  6. UVA 11626 凸包(含共线)
  7. IDEA与tomcat相关配置
  8. 删除一行下方单元格上移_快速删除Excel工作表多余空单元格
  9. java的地位和优势,Java语言之所以能持续占领霸主地位 这些优势功不可没
  10. ruby 嵌套函数_Ruby嵌套有示例的循环
  11. ASP.Net2.0小技巧 保持滚动条的位置 焦点移动到某个控件 $符号轻松的使用FindControl...
  12. amazon 设计 4 vending machine
  13. 如何用DOS命令查看占用某端口的程序及PID号
  14. python基础之包、模块、命名空间和作用域
  15. 如何学习操作系统这门课程?
  16. 第三方支付网关的选择
  17. java存储字节_Java字节与字符流永久存储json数据
  18. 程序员必备-网站推荐
  19. java捕捉摄像头画面_在java中捕获来自网络摄像头的图像?
  20. 微信小程序生成条形码

热门文章

  1. 揭秘高德地图如何利用MaxCompute管理海量数据
  2. 阿里工程师太凶残了,竟把服务器泡在“水里”!
  3. 阿里云明确生态边界:不做SaaS、被集成
  4. 阿里云不做SaaS、要练好内功被集成,发布SaaS加速器
  5. 阿里云应用配置管理ACM发布,重新定义云上配置的存放方式
  6. 2017,人工智能技术如何让中国开发者“倾心”又“上火”!
  7. ​赠书 | 云游戏搭上 5G 快车,华为、腾讯争相布局
  8. 实操来了!一文告诉你如何用 Streamlit 和 Heroku 开发 Web
  9. 剖析疫情环境下的国内云市场:大势所趋,正是大展拳脚的好时机!
  10. Kafka精华问答 | kafka的使用场景是什么?