大话设计模式----抽象工厂模式

一、抽象工厂模式:提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类。

二、代码示例

@Data
public class User {
    private String id;
    private String name;
}

@Data
public class Department {
    private String id;
    private String deptName;
}

public interface IUser {
    void insert(User user);
    User getUser(String id);
}

public interface IDepartment {
    void insert(Department department);
    Department getDepartment(String id);
}

public class SqlserverUser implements IUser {
    @Override
    public void insert(User user) {
        System.out.println("在Sqlserver中给User表插入一条记录");
    }

    @Override
    public User getUser(String id) {
        System.out.println("在sqlserver中根据id获取User一条数据");
        return null;
    }
}

public class AccessUser implements IUser {
    @Override
    public void insert(User user) {
        System.out.println("在Access中给User表插入一条记录");
    }

    @Override
    public User getUser(String id) {
        System.out.println("在Access中根据id获取User一条数据");
        return null;
    }
}

public class AccessDepartment implements IDepartment {

    @Override
    public void insert(Department department) {
        System.out.println("在Access中给Department表插入一条记录");
    }

    @Override
    public Department getDepartment(String id) {
        System.out.println("在Access中根据id获取Department一条数据");
        return null;
    }
}

public class SqlserverDepartment implements IDepartment {

    @Override
    public void insert(Department department) {
        System.out.println("在Sqlserver中给Department表插入一条记录");
    }

    @Override
    public Department getDepartment(String id) {
        System.out.println("在sqlserver中根据id获取Department一条数据");
        return null;
    }
}

public class DataAccess {

    public static Object createObject(Class<?> className) throws IllegalAccessException, InstantiationException {
        return className.newInstance();
       /* IUser iUser = null;
        switch (db){
            case "Sqlserver":
                iUser = new SqlserverUser();
                break;
            case "Access":
                iUser = new AccessUser();
                break;
        }
        return iUser;*/
    }

    /*public static IDepartment createDepartment(Class<?> className) throws IllegalAccessException, InstantiationException {
        return (IDepartment) className.newInstance();
    }*/
}

public class Test {
    public static void main(String[] args) throws IllegalAccessException, InstantiationException {
        User user = new User();
        Department department = new Department();
        IUser iUser = (IUser) DataAccess.createObject(AccessUser.class);
        iUser.getUser("1");
        iUser.insert(user);

        IDepartment iDepartment = (IDepartment) DataAccess.createObject(SqlserverDepartment.class);
        iDepartment.getDepartment("2");
        iDepartment.insert(department);
    }
}

优点:

  1.易于交换产品系列,由于具体工厂类在一个应用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,只需要改变具体工厂即可使用不同产品配置。

  2.它让具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口操作实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户代码中。

猜你喜欢

转载自www.cnblogs.com/zsmcwp/p/12656997.html