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

前言

设计模式能够帮助我们设计出健壮,低耦合性的代码,从此和高耦合的代码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的编程思想





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值