java学习-设计模式之抽象工厂模式

java学习-设计模式-抽象工厂模式

一 定义

     为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类。

二 代码实例

  1. 需求

    对于不同的数据库和不同的表,如mysql,oracle都能够简单的就可以实现查询更新操作。换数据库是,无需改动太多的代码。

  2. 代码实现

部门类:

public class Dept {
    private String deptNo;
    private String deptName;

    public String getDeptNo() {
        return deptNo;
    }

    public void setDeptNo(String deptNo) {
        this.deptNo = deptNo;
    }

    public String getDeptName() {
        return deptName;
    }

    public void setDeptName(String deptName) {
        this.deptName = deptName;
    }

    @Override
    public String toString() {
        return "Dept{" +
                "deptNo='" + deptNo + '\'' +
                ", deptName='" + deptName + '\'' +
                '}';
    }
}

用户类:

public class User {
    private String id;
    private String username;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @Override
    public String toString() {
        return "User{" +
                "id='" + id + '\'' +
                ", username='" + username + '\'' +
                '}';
    }
}

部门接口类:

public interface IDept {

    void insert(Dept dept);

    Dept getById(String id);
}

用户接口类:

public interface IUser {

    void insert(User user);

    User getById(String id);
}

不同数据库实现类:

public class MysqlDeptImpl implements IDept {
    @Override
    public void insert(Dept dept) {
        System.out.println("在mysql数据库Dept表中插入一条数据" + dept.toString());
    }

    @Override
    public Dept getById(String id) {
        System.out.println("在mysql数据库Dept表中通过id为" + id +  "来获得一条数据");
        return null;
    }
}
public class MysqlUserImpl implements IUser {
    @Override
    public void insert(User user) {
        System.out.println("在mysql数据库User表中插入一条数据" + user.toString());
    }

    @Override
    public User getById(String id) {
        System.out.println("在mysql数据库User表中通过id为" + id +  "来获得一条数据");
        return null;
    }
}
public class OracleDeptImpl implements IDept {
    @Override
    public void insert(Dept dept) {
        System.out.println("在oracle数据库Dept表中插入一条数据" + dept.toString());
    }

    @Override
    public Dept getById(String id) {
        System.out.println("在oracle数据库Dept表中通过id为" + id +  "来获得一条数据");
        return null;
    }
}
public class OracleUserImpl implements IUser {
    @Override
    public void insert(User user) {
        System.out.println("在oracle数据库User表中插入一条数据" + user.toString());
    }

    @Override
    public User getById(String id) {
        System.out.println("在oracle数据库User表中通过id为" + id +  "来获得一条数据");
        return null;
    }
}

具体的工厂类:(重点)

package com.ct.factory;

public class IFactory {
    private static String packageName = "com.ct.factory.impl.";
    //实际开发中可以设置到properties文件中 值为Oracle则操作oracle数据库
    private static String dbName = "Mysql";

    public static IUser createUserOpera() {
        String name = packageName + dbName + "UserImpl";
        IUser iUser = null;
        try {
            iUser = (IUser) Class.forName(name).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return iUser;
    }

    public static IDept createDeptOpera() {
        String name = packageName + dbName + "DeptImpl";
        IDept iDept = null;
        try {
            iDept = (IDept) Class.forName(name).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return iDept;
    }
}

测试类:

public class Test {
    public static void main(String[] args) {
        User user = new User();
        user.setId("1");
        user.setUsername("zhangsan");

        IUser iUser = IFactory.createUserOpera();
        iUser.insert(user);
        iUser.getById("1");

        Dept dept = new Dept();
        dept.setDeptNo("1");
        dept.setDeptName("事业部");
        IDept iDept = IFactory.createDeptOpera();
        iDept.insert(dept);
        iDept.getById("1");
    }
}

抽象工厂模式:提供一个创建一系列相关或相互依赖的对象接口,而无需指定它们具体的类。该工厂通过java的反射技术进行创建具体的对象。更换数据库,只需要改一处即可。增加新的数据库或者增加新的表只需要增加实现类即可,开放封闭原则得到了完美的体现。而且可扩展,灵活,易于维护。

微信扫一扫
关注该公众号

猜你喜欢

转载自blog.csdn.net/qq_31689009/article/details/102474318
今日推荐