反射+配置文件+抽象工厂

用反射技术去除Switch或者if,解除简单工厂类的判断语句带来的耦合。

用配置文件全项目替代数据库类型实现Oracle、Mysql,或者加入SqlServer等数据库实现。

优点:比抽象工厂减少耦合(Ifactory,MysqlFactory,OracleFactory变为一个ReflectSqlFactory,而且切换数据库只需要改配置文件)

     比简单工厂减少耦合(采用反射技术,减少switch或if 语句)

sql.properties

db=Mysql

ReflectSqlFactory类

package reflectAbstractFactory;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Iterator;
import java.util.Properties;

import reflectAbstractFactory.dept.IDeptDao;
import reflectAbstractFactory.user.IUserDao;

public class ReflectSqlFactory {
    public String getDb() {
        Properties prop = new Properties();
        String db = "";
        try {
            // 读取属性文件a.properties
            InputStream in = new BufferedInputStream(new FileInputStream(
                    "E:/workspace/dahuasheji/sampleFactory/src/reflectAbstractFactory/sql.properties"));
            prop.load(in); // /加载属性列表
            Iterator<String> it = prop.stringPropertyNames().iterator();
            while (it.hasNext()) {
                String key = it.next();
                if("db".endsWith(key)){
                    db = prop.getProperty("db");
                    break;
                }
            }
            in.close();
        } catch (Exception e) {
            System.out.println(e);
        }
        return db;
    }
    public Class<?> getsqlFactory(String pge,String type) throws ClassNotFoundException{
        String className= "reflectAbstractFactory."+pge+getDb()+type+"Dao";
        System.out.println(className);
        Class<?> c1 = Class.forName(className);
        System.out.println(c1.getName());
        return c1;
    }
    public IUserDao createUser() throws InstantiationException, IllegalAccessException, ClassNotFoundException{
        Class<?> c = getsqlFactory("user.","User");
        IUserDao iu = (IUserDao)c.newInstance();
        return iu;
    };
    public IDeptDao createDept() throws ClassNotFoundException, InstantiationException, IllegalAccessException{
        Class<?> c = getsqlFactory("dept.","Dept");
        IDeptDao id = (IDeptDao)c.newInstance();
        return id;
    };
}

Business类

package reflectAbstractFactory;

import reflectAbstractFactory.dept.Department;
import reflectAbstractFactory.dept.IDeptDao;
import reflectAbstractFactory.user.IUserDao;
import reflectAbstractFactory.user.User;

public class Business {

    public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
        //产品1系列
        User user = new User();
        ReflectSqlFactory reflectSqlFactory = new ReflectSqlFactory();
        IUserDao iuDao = reflectSqlFactory.createUser();
        iuDao.insert(user);
        iuDao.getUser(1);

        //产品2系列
        Department dept = new Department();
        IDeptDao idepatDao = reflectSqlFactory.createDept();
        idepatDao.insert(dept);
        idepatDao.getDept(1);

    }

}

Department类

package reflectAbstractFactory.dept;

public class Department {
    private long id;
    private String deptName;
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    public String getDeptName() {
        return deptName;
    }
    public void setDeptName(String deptName) {
        this.deptName = deptName;
    }

}

IDeptDao类

package reflectAbstractFactory.dept;

public interface IDeptDao {
    void insert(Department dept);
    void getDept(int id);
}

MysqlDeptDao类

package reflectAbstractFactory.dept;

public class MysqlDeptDao implements IDeptDao {

    @Override
    public void insert(Department dept) {
        System.out.println("在mysql数据库的department表插入一条记录");
    }

    @Override
    public void getDept(int id) {
        System.out.println("在mysql数据库的department表根据ID获取一条记录");
    }

}

OracleDeptDao类

package reflectAbstractFactory.dept;

public class OracleDeptDao implements IDeptDao {

    @Override
    public void insert(Department dept) {
        System.out.println("在oracle数据库的department表插入一条记录");
    }

    @Override
    public void getDept(int id) {
        System.out.println("在oracle数据库的department表根据ID获取一条记录");
    }

}

IUserDao类

package reflectAbstractFactory.user;

public interface IUserDao {
    void insert(User user);
    void getUser(int id);
}

MysqlUserDao类

package reflectAbstractFactory.user;

public class MysqlUserDao implements IUserDao {

    @Override
    public void insert(User user) {
        System.out.println("在mysql数据库的user表插入一条记录");
    }

    @Override
    public void getUser(int id) {
        System.out.println("在mysql数据库的user表根据ID获取一条记录");
    }

}

OracleUserDao类

package reflectAbstractFactory.user;

public class OracleUserDao implements IUserDao {

    @Override
    public void insert(User user) {
        System.out.println("在oracle数据库的user表插入一条记录");
    }

    @Override
    public void getUser(int id) {
        System.out.println("在oracle数据库的user表根据ID获取一条记录");
    }

}

User类

package reflectAbstractFactory.user;

public class User {
    private long id;
    private String name;
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

}

package reflectAbstractFactory;
import java.io.BufferedInputStream;import java.io.FileInputStream;import java.io.InputStream;import java.util.Iterator;import java.util.Properties;
import reflectAbstractFactory.dept.IDeptDao;import reflectAbstractFactory.user.IUserDao;
public class ReflectSqlFactory {public String getDb() {Properties prop = new Properties();String db = "";try {// 读取属性文件a.propertiesInputStream in = new BufferedInputStream(new FileInputStream("E:/workspace/dahuasheji/sampleFactory/src/reflectAbstractFactory/sql.properties"));prop.load(in); // /加载属性列表Iterator<String> it = prop.stringPropertyNames().iterator();while (it.hasNext()) {String key = it.next();if("db".endsWith(key)){db = prop.getProperty("db");break;}}in.close();} catch (Exception e) {System.out.println(e);}return db;}public Class<?> getsqlFactory(String pge,String type) throws ClassNotFoundException{String className= "reflectAbstractFactory."+pge+getDb()+type+"Dao";System.out.println(className);Class<?> c1 = Class.forName(className);System.out.println(c1.getName());return c1;}public IUserDao createUser() throws InstantiationException, IllegalAccessException, ClassNotFoundException{Class<?> c = getsqlFactory("user.","User");IUserDao iu = (IUserDao)c.newInstance();return iu;};public IDeptDao createDept() throws ClassNotFoundException, InstantiationException, IllegalAccessException{Class<?> c = getsqlFactory("dept.","Dept");IDeptDao id = (IDeptDao)c.newInstance();return id;};}

时间: 2024-10-10 06:13:55

反射+配置文件+抽象工厂的相关文章

应用反射+配置文件+抽象工厂时出现的错误和原因分析

先来看一段程序: <pre name="code" class="vb">Imports System.Configuration '配置文件命名空间 Imports System.Reflection '反射命名空间 Imports IDAL '引用接口层 Public Class DataAccess '程序集名称(同时代表命名空间名称):DAL Private Shared ReadOnly AssemblyName As String = Sys

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

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

测开之路十八:反射与抽象工厂

反射: hasattr:查看对象里面是否存在某变量 setattr:往对象里面插入变量 delatt:删除对象里面的变量 getattr:获取变量的值 __import__:导入需要的模块,参数必须是字符串,模块必须存在 抽象工厂:抽象工厂一般用于读配置文件去实例化对应的对象 原文地址:https://www.cnblogs.com/zhongyehai/p/10807243.html

泛型、反射和抽象工厂结合解决多DB问题

重构机房收费系统总结1之配置文件+反射+抽象工厂

在重构机房收费系统之前就一直听说这次重构要用反射+配置文件.深远的作用不知道,但是在这次重构用到,目的还是挺明确的:就是为了更换数据时方便,遵循开放-封闭原则,解决了可维护和可扩展的问题. 下面就以机房收费系统登录为例来看看配置文件+反射的用法.机房收费系统登录用到的数据库表是User_info表(用户表).我利用的是三层思想,先看一下我的整体架构! 下面看看配置文件+反射+抽象工厂在登录时访问数据库User表时的用法. 1.先进行配置文件操作 步骤:(1)在VS资源管理器的新建项目UI中,会有

反射+抽象工厂模式

这里通过一个DEMO介绍反射配合抽象工厂模式的运用.大概业务背景就是在实际业务过程中,可能要替换数据库,具体代码如下: 1.User实体类 class User { private int id; private string name; public int Id { get { return id; } set { id = value; } } public string Name { get { return name; } set { name = value; } } } 2.操作U

第15章 就不能换DB吗?—抽象工厂模式

由于抽象工厂在我们编程当中经常使用和常见,所有本篇文章对<大话设计模式>中的15章做了很详细的比较.通过一个Dao层可以更换访问任意数据库的例子来学习抽象工厂模式.例如:Dao层可以访问Sqlserver数据库,也可以访问Access数据库,当程序新增访问Oracle数据库时,无需修改现有代码,只需要添加访问Oracle相关的类就可以,实现了开闭原则.本篇文章的例子中每种数据库上都有User和Department表,我们Dao层对这两个表进行查询和插入操作. 最基本数据库访问 一下是访问Sql

MVC+EF三层+抽象工厂项目搭建

注意:项目经过两次搭建,所以截图中顶级命名空间有ZHH和ZHH2区别,但是架构的内容是一样的,可以将ZHH和ZHH2视为同一命名空间 一:权限管理 二:搜索 |-Lucene.net(速度快)+盘古分词(搜索词拆分)---比模糊查询更模糊 |-模糊查询like效率慢,全盘扫描,不能拆分 盘古分词,分出来的词,用文件存在磁盘内 ,文件并发 ----lock锁->新的问题,效率慢,用户需要等待 生产者消费者模式---优化文件并发 把分词放在队列中(内存集合中),Redis分布式队列 *sesion只

简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别

结合简单示例和UML图,讲解工厂模式简单原理. 一.引子 话说十年前,有一个爆发户,他家有三辆汽车(Benz(奔驰).Bmw(宝马).Audi(奥迪)),还雇了司机为他开车.不过,爆发户坐车时总是这样:上Benz车后跟司机说"开奔驰车!",坐上Bmw后他说"开宝马车!",坐上 Audi后他说"开奥迪车!".你一定说:这人有病!直接说开车不就行了?!而当把这个爆发户的行为放到我们程序语言中来,我们发现C语言一直是通过这种方式来坐车的!幸运的是这种有