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

本文涉及的产品
云数据库 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,这一点不符合开闭原则。显然使用反射+配置文件可以解决后者。

目录
相关文章
|
消息中间件 设计模式 缓存
复习这份美团架构师的Java核心面试宝典,我四面阿里拿下offer
怎样才能拿到大厂的offer,没有掌握绝对的技术,那么就要不断的学习 他是如何拿下阿里等大厂的offer的呢,今天分享他的秘密武器,美团资深架构师整理的Java核心知识点,面试时面试官必问的知识点,篇章包括了很多知识点,其中包括了有基础知识、Java集合、JVM、多线程并发、spring原理、微服务、Netty 与RPC 、Kafka、日记、设计模式、Java算法、数据库、Zookeeper、分布式缓存、数据结构等等。
|
NoSQL 网络协议 测试技术
Redis 中 List 的使用细节 | 学习笔记
快速学习 Redis 中 List 的使用细节
|
弹性计算 云计算 数据可视化
心选建站---根据企业和个人阿里云建站的优点与缺点
阿里云建站产品如何选择?如果您是站长类的技术人员,当然选择自助建站方式,如果非技术人员,个人或者工作室建议选择云·速成美站,如果是企业用户建站选择阿里云网站定制服务。
|
8天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1194 4
|
7天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
950 12
|
6天前
|
机器学习/深度学习 物联网
Wan2.2再次开源数字人:Animate-14B!一键实现电影角色替换和动作驱动
今天,通义万相的视频生成模型又又又开源了!Wan2.2系列模型家族新增数字人成员Wan2.2-Animate-14B。
536 11
|
17天前
|
人工智能 运维 安全
|
8天前
|
弹性计算 Kubernetes jenkins
如何在 ECS/EKS 集群中有效使用 Jenkins
本文探讨了如何将 Jenkins 与 AWS ECS 和 EKS 集群集成,以构建高效、灵活且具备自动扩缩容能力的 CI/CD 流水线,提升软件交付效率并优化资源成本。
341 0