设计模式系列之一:简单工厂模式

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介:

前言

设计模式能够帮助我们设计出健壮,低耦合性的代码,从此和高耦合的代码say goodbye!在所有的的设计模式中,简单工厂算是我们平时接触比较多的吧,多线程中的消费者工厂类与生产者工厂类应该算是接触最早的设计模式,简单工厂模式要解决的首要问题就是降低程序之间的耦合度,通过Java中的封装、继承与多态实现解耦。通过使用简单工厂模式,我们设计的代码更易于维护和复用

问题背景

在进入正题之前我们先看一下问题背景:

某公司开发了一个A软件,数据库使用的是SQLServer。后由于客户要求需要使用Oracle数据库,原来的数据要迁移到Oracle中,在迁移的过程中遇到很多问题,比如语法错误,关键字滥用,函数不支持等问题。请设计一组程序,实现数据的无缝迁移。

不使用任何模式


原始数据库访问方式

为了简单起见,我们先写一组访问用户信息的数据库访问程序,用户有id和name属性,实现用户信息的查找(根据id)与添加功能

这里只是模拟程序的运行过程,并不真正从数据库中获取用户信息

public class User {
    private int id;
    private String name;
    //省略setter与getter方法
}

public class SqlServerUser {
    //添加用户的方法
    public void insertUser(User user){
        System.out.println("使用SQLServer添加用户");
    }
    //查找用户信息的方法
    public User findUserById(int id){
        System.out.println("使用SQLServer通过id找到用户");
        return null;
    }
}

public class OracleUser {
    //方法与上面一样,就是把SqlServer改成Oracle
}

public class Test{
    public static void main(String[] args) {
        User user = new User();
        SqlServerUser su = new SqlServerUser();
        su.insertUser(user);
        su.findUserById(1);
        OracleUser ou = new OracleUser();
        ou.insertUser(user);
        ou.findUserById(1);
    }
}

这里由于直接在客户端创建的SqlServer对象,客户一旦使用其他数据库就意味着原来的su对象是无效的,全部都得重来。当数据量庞大的时候,无疑会带来巨大工作量,如果能够在客户端根据用户选择的数据库对象灵活创建相应的数据库,无疑会减少很多工作量。

使用简单工厂模式


使用简单工厂的大致思路是:根据用户选择的数据库类型,创建相应的数据库对象,在客户端只要传入这个参数,具体生产对象的过程由工厂去实现。

//数据库对象的抽象类
public abstract class DBObject {
    //添加用户的方法
    public abstract void insertUser(User user);
    //查找用户信息的方法
    public abstract User findUserById(int id);
}
//Oracle数据库对象的实现类
public class OracleObject extends DBObject{
    @Override
    public void insertUser(User user) {
        System.out.println("使用Oracle添加用户");
    }
    @Override
    public User findUserById(int id) {
        System.out.println("使用Oracle通过id找到用户");
        return null;
    }
}
//SqlServer数据库对象的实现类
public class SqlServerObejct extends DBObject{
    @Override
    public void insertUser(User user) {
        System.out.println("使用SQLServer添加用户");
    }
    @Override
    public User findUserById(int id) {
        System.out.println("使用SQLServer通过id找到用户");
        return null;
    }
}
//工厂
public class DBFactory {
    public static DBObject createDBObject(String dbType){
        switch (dbType){
            case "oracle":
                return new OracleObject();
            case "sqlserver":
                return new SqlServerObejct();
        }
        return null;
    }
}
//测试方法
public static void main(String[] args) {
    DBObject db = DBFactory.createDBObject("oracle");
    db.insertUser(new User());
    db.findUserById(1);
}

最后的测试结果:

请输入你要创建的数据库类型:
oracle
使用Oracle添加用户
使用Oracle通过id找到用户

这里通过封装,把创建实例的过程交给工厂去完成,客户端只需要确定选择的数据库类型,DBFactory就会生成一个数据库实例,用户拿着这个实例就可以进行数据库的操作了。通过这种方式,客户端的操作与具体的数据库创建就已经解耦了。

简单工厂模式小结

总结简单工厂模式,有以下好处:
* 可以根据客户端的选择动态创建相应的实例,消除了对具体产品的依赖
* 是Java封装、继承和多态的运用,体现了OOP的编程思想

相关实践学习
使用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
目录
相关文章
|
15天前
|
设计模式 SQL 算法
设计模式了解哪些,模版模式
设计模式了解哪些,模版模式
19 0
|
1月前
|
设计模式 Java uml
C++设计模式之 依赖注入模式探索
C++设计模式之 依赖注入模式探索
37 0
|
3月前
|
设计模式 存储 算法
Java 设计模式最佳实践:三、行为模式
Java 设计模式最佳实践:三、行为模式
22 0
|
3月前
|
设计模式 Go 开发工具
Golang设计模式——12中介模式
Golang设计模式——12中介模式
26 0
|
2月前
|
设计模式 前端开发 JavaScript
观察者模式 vs 发布-订阅模式:两种设计模式的对决!
欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚开始学习前端的读者们打造的。无论你是初学者还是有一些基础的开发者,我们都会在这里为你提供一个系统而又亲切的学习平台。我们以问答形式更新,为大家呈现精选的前端知识点和最佳实践。通过深入浅出的解释概念,并提供实际案例和练习,让你逐步建立起一个扎实的基础。无论是HTML、CSS、JavaScript还是最新的前端框架和工具,我们都将为你提供丰富的内容和实用技巧,帮助你更好地理解并运用前端开发中的各种技术。
|
11天前
|
设计模式 Java 数据库
小谈设计模式(2)—简单工厂模式
小谈设计模式(2)—简单工厂模式
|
1天前
|
设计模式
设计模式(一)简单工厂模式
设计模式(一)简单工厂模式
4 0
|
11天前
|
设计模式 Java
小谈设计模式(9)—工厂方法模式
小谈设计模式(9)—工厂方法模式
|
1月前
|
设计模式 编译器
解析器模式--设计模式
解析器模式--设计模式
17 0
|
1月前
|
设计模式 算法
构建器模式--设计模式
构建器模式--设计模式
17 0