简单工厂+反射+配置文件

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介: 简单工厂+反射+配置文件

用反射+配置文件的方法重新实现大话设计模式课本上15章15.7的例题

问题分析:相比抽象工厂,用DataAccess类代替了工厂接口以及工厂类,再加上使用反射+配置文件的方式,可以做到不对编译好的程序作出改变就能修改数据库种类,客户端可以只是用DateAccess进行数据库访问实例的创建,达到了解耦的目的。

UML图:
在这里插入图片描述

package com.cmc;
//用户数据类
public class User {
    private int id;
    private String name;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
 
package com.cmc;
//部门数据类
public class Department {
    int id;
    String dept_name;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getDept_name() {
        return dept_name;
    }
    public void setDept_name(String dept_name) {
        this.dept_name = dept_name;
    }
    
}
package com.cmc;
//用户数据库操作的接口
public interface IUser {
    void insert(User user);
    User getUser(int id);
}
package com.cmc;
//部门数据库操作接口
public interface IDepartment {
    void insert(Department department);
    
    Department getDepartment(int id);
}
package com.cmc;
//在SqlServer中实现对用户数据库的操作
public class SqlserverUser implements IUser {
 
    public User getUser(int id) {
        System.out.println("在SQL Server中根据ID得到一条记录");
        return null;
    }
 
    public void insert(User u) {
        // TODO Auto-generated method stub
        System.out.println("在SQL Server 中给user表添加一条记录");
 
    }
 
}
package com.cmc;
//在Access中实现对用户数据库的操作
public class AccessUser implements IUser {
 
    public User getUser(int id) {
        System.out.println("在Access中根据ID得到一条记录");
        return null;
    }
 
    public void insert(User user) {
        // TODO Auto-generated method stub
        System.out.println("在Access中给user表添加一条记录");
 
    }
 
}
package com.cmc;
 
public class SqlserverDepartment implements IDepartment {
 
    public Department getDepartment(int id) {
        System.out.println("在SQL Server中根据ID得到一条记录");
        // TODO Auto-generated method stub
        return null;
    }
 
    public void insert(Department department) {
        // TODO Auto-generated method stub
        System.out.println("在SQL Server 中给Department表添加一条记录");
 
    }
 
}
package com.cmc;
 
public class AccessDepartment implements IDepartment {
 
    public Department getDepartment(int id) {
        System.out.println("在Access中根据ID得到一条记录");
        // TODO Auto-generated method stub
        return null;
    }
 
    public void insert(Department department) {
        // TODO Auto-generated method stub
        System.out.println("在Access中给Department表添加一条记录");
    }
 
}
 
package com.cmc;
//通过配置文件+反射对要创建的类进行切换
import java.io.IOException;
import java.util.Properties;
 
import config.RunMain;
 
public class DataAccess {
    public static IUser CreatUser(){
        IUser result = null;
        Properties prop = new Properties();
        try {
            prop.load(RunMain.class.getResourceAsStream("/com/cmc/datebase.properties"));
            Class db = Class.forName("com.cmc."+prop.getProperty("dbuser"));
            result = (IUser)db.newInstance();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }
    public static IDepartment CreatDepartment(){
        IDepartment result = null;
        Properties properties = new Properties();
        try {
            properties.load(RunMain.class.getResourceAsStream("/com/cmc/datebase.properties"));
            Class db = Class.forName("com.cmc."+properties.getProperty("dbdepartment"));
            result=(IDepartment)db.newInstance();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }
}

优点:
1.实现了组件的封装,然后让组件外部能真正面向接口编程。
2.通过简单工厂,实现了客户端和具体实现类的解耦。
缺点:不方便扩展子工厂,如果要增加oracle数据库,必须在DateAccess类中增加oracle的方法,在工厂中增加创建case,这一点不符合开闭原则。显然使用反射+配置文件可以解决后者。

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
9月前
|
设计模式 Java
Java反射(Class、反射实例化、反射与单例、获取类结构)附带相关面试题
1.了解反射,2.Class类的三种实例化方法,3.反射机制与对象实例化,4.反射与单例设计模式,5.通过反射获取类结构的信息
204 0
|
5月前
|
Java
【反射】Java反射机制 -- 常用构造器与方法
【反射】Java反射机制 -- 常用构造器与方法
28 0
|
7天前
|
设计模式 Java
【SpringBoot】如何使用策略模式+抽象工厂+反射
【SpringBoot】如何使用策略模式+抽象工厂+反射
15 2
|
9月前
|
设计模式 缓存 Java
Java反射(反射与代理设计模式、反射与Annotation、自定义Annotation、反射整合工厂设计模式和代理设计模式)
1.反射与代理设计模式,2.反射与Annotation,3.自定义Annotation,4.Annotation整合工厂设计模式和代理设计模式
45 0
从工厂方法到注解的小例子
这里的前几个过程就不符代码了,请读者自行补充;只附上第四版,通过注解替换工厂方法实现自动化的小例子
|
uml
工厂模式+配置文件+反射实现数据访问程序
工厂模式+配置文件+反射实现数据访问程序
82 0
工厂模式+配置文件+反射实现数据访问程序
Java反射->什么是反射?->获取方式
Java反射->什么是反射?->获取方式
Java反射->什么是反射?->获取方式
|
设计模式 缓存 Java
多用静态工厂代替构造器
这一节其实也是在说明工厂设计模式的优秀之处,它相对于构造函数的优势在于:
|
Java
查看JDK动态代理生成的类的内容
首先我们先定义一个接口: public interface PersonInter { String test(String str); }接着就是我们想的要生成的JDK代理类源码的代码: public class JdkProxy...
1477 0
如何使用反射获取类对象
如何使用反射获取类对象
100 0
如何使用反射获取类对象