简单的工厂+反射+ xml解耦和

传统的调用业务层是:

  CustomerServiceImpl csi = new CustomerServiceImpl();

通过面向接口编程改进过后:

  CustomerService cs = new CustomerServiceImpl();

这种还是不好,因为如果我要修改底层的实现类,还是要修改源代码

我们编程应该遵循opc原则:open-close:对程序扩展是开放的,对修改源码是关闭的

所以我们需要降低程序之间的耦合性,解耦和操作

在接口和实现类之间用工厂来解耦和

就像

CustomerService cs = new CustomerServiceImpl();我们要通过工厂模式改造成:

CustomerService cs = BeanFatory.getCustomerService();

所以在BeanFactory中的代码应该是:

     class BeanFactory {
        public static CustomerService getCustomerService() {
            return new CustomerServiceImpl();
        }
    }

但是我们发现这样做也不好,因为实现类跟这个工厂耦合了,而且如果有其他的service,我们还
需要为每个service都写一个工厂的方法

在这个基础上,我们需要进一步改进得连工厂都不需要修改

所以用工厂+反射+配置文件来解耦和

在xml文件中配置接口名,和实现类的绝对路径

其实这就是最简单的控制反转

在src下建立一个xml文件

例如我们在src下建立了一个applicationContext.xml文件

里面配置了service层和到层的解耦和文件

<?xml version="1.0" encoding="UTF-8"?>
<beans>
    <!-- 配置service层解耦 -->
    <bean id="CategoryService" class="com.project.service.imp.CategoryServiceImpl"></bean>
    <bean id="ProductService" class="com.project.service.imp.ProductServiceImpl"></bean>
    <bean id="UserService" class="com.project.service.imp.UserServiceImpl"></bean>

    <!-- 配置dao层解耦 -->
    <bean id="CategoryDao" class="com.project.dao.imp.CategoryDaoImpl"></bean>
    <bean id="ProductDao" class="com.project.dao.imp.ProductDaoImpl"></bean>
    <bean id="UserDao" class="com.project.dao.imp.UserDaoImpl"></bean>
</beans>

写一个BeanFactory类

public class BeanFactory {
    public static Object getBean(String id) {
        try {
            //用类加载器解析xml文件
            SAXReader reader = new SAXReader();
            Document document = reader.read(BeanFactory.class.getClassLoader().getResourceAsStream("applicationContext.xml"));
            //xpath技术获得bean元素
            Element element = (Element) document.selectSingleNode("//bean[@id=‘"+id+"‘]");
            //拿到class属性里面的值
            String value = element.attributeValue("class");
            //获得反射对象
            Class clazz = Class.forName(value);
            //获得实例
            return clazz.newInstance();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException();
        }
    }
}

这样我们要调用service层就成了

CategoryService cs = (CategoryService )BeanFactory.getBean("CategoryService ");

时间: 2024-11-18 07:19:03

简单的工厂+反射+ xml解耦和的相关文章

谈一谈:抽象工厂+反射+配置文件 实现数据访问程序

<大话设计模式>中第15章中<就不能不换DB吗?>引出了我今天要谈论的主题:抽象工厂+反射+配置文件 实现数据访问程序.当时也不甚理解啊!到了机房收费的亲身实践中,终于体会到了这对组合的奥秘. 抽象工厂模式(Abstract Factory) 提供一个创建一系列相关或相互依赖对象的接口,而无需制定它们具体的类.知道它是用来创建工厂的就OK了. 反射 提供了封装程序集.模块和类型的对象.这里仅仅用到反射的一部分功能.且记住它的格式: Assembly.Load("程序集名称

思想上移,行动下移——抽象工厂+反射+配置文件

从网上查找资料的时候发现很多同学都写过这篇博客了,可见我的方向没有跑偏.虽然我们学设计模式的时候已经接触过抽象工厂模式,大话设计模式中每个设计模式都紧密联系生活,而且主人公讲的也相当有趣,但是真正运用起来却没那么简单.可以说小菜只是帮我们理解了各个设计模式的用途以及有确定,真正的理解还需要我们自己动手实践. 为什么要用抽象工厂? 主要就是为了提高软件的灵活性,运用抽象工厂+反射+配置文件可以很方便的更换数据库.引入接口之后,就可以对外提供一致的接口,而我们既可以用SQLServer实现接口,也可

浅析 抽象工厂、工厂方法、简单(静态)工厂

----简单工厂 (也叫静态工厂模式):一个抽象产品抽象出多个具体产品类,一个具体工厂类 代码: //抽象产品角色 public interface Car{ public void drive(); } //具体产品角色 public class Benz implements Car{ public void drive() { System.out.println("Driving Benz "); } } public class Bmw implements Car{ pub

简单的工厂模式

从今天开始 每天进步一点点.开始了解并学习设计模式,就从简单的工厂模式开始吧.... 简单工厂模式(Simple Factory):不利于产生系列产品 简单工厂模式又称静态工厂方法模式.重命名上就可以看出这个模式一定很简单.它存在的目的很简单:定义一个用于创建对象的接口. 在简单工厂模式中,一个工厂类处于对产品类实例化调用的中心位置上,它决定那一个产品类应当被实例化, 如同一个交通警察站在来往的车辆流中,决定放行那一个方向的车辆向那一个方向流动一样. 先来看看它的组成: 1) 工厂类角色:这是本

大话设计模式之简单的工厂模式

第一章:代码无错就是优-简单的工厂模式 先建立一个计算类Operation Operation.h文件 @interface Operation : NSObject @property(nonatomic,assign)double numberA; @property(nonatomic,assign)double numberB; @end Operation.m文件 @implementation Operation @end 然后分别创建他们的子类Add,Sub,Mul,Div Add

设计模式学习之简单工厂+反射+配置文件

3.用反射+配置文件的方法重新实现大话设计模式课本上15章15.7的例题 问题分析:相比抽象工厂,用DataAccess类代替了工厂接口以及工厂类,再加上使用反射+配置文件的方式,可以做到不对编译好的程序作出改变就能修改数据库种类,客户端可以只是用DateAccess进行数据库访问实例的创建,达到了解耦的目的. UML图: package com.cmc; //用户数据类 public class User { private int id; private String name; publi

一(3)抽象工厂模式&amp;&amp;简单工厂+反射改进抽象工厂

1 抽象工厂? 抽象工厂用在既有产品树,又有产品族的场合. 产品树:奔驰旗下的跑车和商务车构成产品树 产品族:奔驰旗下的跑车与奥迪旗下的跑车构成产品族./*缺点:此时如果需要增加一个红旗厂家的车,需要改的地方很多.1 定义红旗抽象类,具体类:2 Factory接口增加生产红旗的工厂:3 跑车工厂和商务车工厂都需要实现相应的生产红旗的接口.*//* 优点:当需要使用不同产品时,只需要改一行代码 Factory factory = new SprotCarFactory();,即初始化不同的工厂,就

简单实体类和xml文件的相互转换

最近写一个题目,要求将一组员工实体类转换成xml文件,或将xml文件转换成一组实体类.题目不难,但写完感觉可以利用泛型和反射将任意一个实体类和xml文件进行转换.于是今天下午立马动手 试了下,做了个简单的模型,可以将简单的实体类和xml文件进行相互转换,但对实体类的属性类型有限制,目前只支持String, Integer, Double三种类型.但是后面可以扩展. 我的大概思路是这样的,只要能拿到实体类的类型信息,我就能拿到实体类的全部字段名称和类型,拼属性的set和get方法更是简单明了,这时

应用抽象工厂+反射实现通用数据源的设计(二)

上篇博文到学生表的一个接口由SqlServerDal和AccessDal层实现具体的方法. 下面定义一个生产抽象产品工厂的接口: 五:定义MySchoolIFactory下IStudentFactory的工厂(引用IStudens接口): public interface IStudentFactory { //产生学生接口的抽象工厂接口 IStudent CreateStudent(); } 六:有两个具体的工厂:SQLServerFactory和AccessFactory(引用MySchoo