设计模式——抽象工厂模式(AbstractFactoryPattern)

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

UML图:

IFactory:

package com.cnblog.clarck;

public interface IFactory {
    IUser createUser();
    
    IDepartment createDepartment();
}

SqlserverFactory:

package com.cnblog.clarck;

public class SqlserverFactory implements IFactory {

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

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

}
AccessFactory:
package com.cnblog.clarck;

public class AccessFactory implements IFactory {

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

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

}

IUser:

package com.cnblog.clarck;

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

AccessUser:

package com.cnblog.clarck;

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

}

SqlserverUser:

package com.cnblog.clarck;

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

IDepartment:

package com.cnblog.clarck;

/**
 * IDepartment 接口,用于客户端访问,解除与具体数据库访问的耦合
 * 
 * @author clarck
 * 
 */
public interface IDepartment {
    public void insert(Department department);

    public Department getDepartment(int id);
}

AccessDepartment:

package com.cnblog.clarck;

public class AccessDepartment implements IDepartment {

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

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

}

SqlserverDepartment:

package com.cnblog.clarck;

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

}

Department:

package com.cnblog.clarck;

public class Department {
    private int mID;
    private String mDeptName;

    public int getID() {
        return mID;
    }

    public void setID(int mID) {
        this.mID = mID;
    }

    public String getDeptName() {
        return mDeptName;
    }

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

}

User:

package com.cnblog.clarck;

public class User {
    private int mID;
    private String mName;

    public int getID() {
        return mID;
    }

    public void setID(int mID) {
        this.mID = mID;
    }

    public String getName() {
        return mName;
    }

    public void setName(String mName) {
        this.mName = mName;
    }

}

 Client:

package com.cnblog.clarck;

public class Client {
    public static void main(String[] args) {
        User user = new User();
        Department department = new Department();
        
        //IFactory factory = new SqlserverFactory();
        IFactory factory = new AccessFactory();
        
        IUser iu = factory.createUser();
        iu.insert(user);
        iu.getUser(1);
        
        IDepartment iDepartment = factory.createDepartment();
        iDepartment.insert(department);
        iDepartment.getDepartment(1);
    }
}
原文地址:https://www.cnblogs.com/tanlon/p/3451477.html