victory的博客

长安一片月,万户捣衣声

0%

设计模式 | 抽象工厂模式

抽象工厂模式

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

抽象工厂模式(通俗易懂)

案例
类图:

class Department{
    private int id;
    private String deptName;
    
    public int getId() {
        return id;
    }
    
    public void setId(int id) {
        this.id = id;
    }
    
    public String getDeptName() {
        return deptName;
    }
    
    public void setDeptName(String deptName) {
        this.deptName = deptName;
    }
}

interface IDepartment
{
    void insert(Department deparment);
    Department getDepartment(int id);
}

//用于访问SQL Server中的Department
class SqlserverDepartment implements IDepartment{
    @Override
    public void insert(Department department) {
        System.out.println("在SQL Server中给Department表增加一条记录");
    }

    @Override
    public Department getDepartment(int id) {
        System.out.println("在SQL Server中根据ID得到Department表一条记录");
        return null;
    }
}

//用于访问Access的Department
class AccessDepartment implements IDepartment{

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

    @Override
    public Department getDepartment(int id) {
        System.out.println("在Access中根据ID得到Department表一条记录");
        return null;
    }
}

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;
    }
}

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

//用于访问SQL Server中的User
class SqlserverUser implements IUser{
    @Override
    public void insert(User user) {
        System.out.println("在SQL Server中给User表增加一条记录");
    }

    @Override
    public User getUser(int id) {
        System.out.println("在SQL Server中根据ID得到User表一条记录");
        return null;
    }
}

//用于访问Access的User
class AccessUser implements IUser{

    @Override
    public void insert(User user) {
        System.out.println("在Access中给User表增加一条记录");
    }

    @Override
    public User getUser(int id) {
        System.out.println("在Access中根据ID得到User表一条记录");
        return null;
    }
}

//定义创建访问User、Department表对象的抽象的工厂接口
interface IFactory1{
    IUser createUser();
    IDepartment createDepartment();
}

//实现IFactory1接口,实例化SqlserverUser和SqlserverDepartment
class SqlserverFactory implements IFactory1{

    @Override
    public IUser createUser() {
        return new SqlserverUser();
    }

    @Override
    public IDepartment createDepartment() {
        return new SqlserverDepartment();
    }
}

//实现IFactory1接口,实例化AccessUser和AccessDepartment
class AccessFactory implements IFactory1{

    @Override
    public IUser createUser() {
        return new AccessUser();
    }

    @Override
    public IDepartment createDepartment() {
        return new AccessDepartment();
    }
}


public class AbstractFactory {
    public static void main(String[] args) {
        User user = new User();
        Department dept = new Department();
        
        //只需确定实例化哪一个数据库访问对象给factory
        IFactory1 factory = new SqlserverFactory();
        //IFactory1 factory = new AccessFactory();
        
        IUser iu = factory.createUser();
        
        iu.insert(user);
        iu.getUser(1);
        
        IDepartment id = factory.createDepartment();
        id.insert(dept);
        id.getDepartment(1);
        
    }
}