設(shè)計(jì)模式(四) 抽象工廠模式

定義

UML類圖

簡單實(shí)現(xiàn)

最基本的數(shù)據(jù)訪問程序

User表

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

SqlServerUser類

public class SqlServerUser {
    private static final String TAG = "SqlServerUser";
    public void insertUser(User user){
        Log.d(TAG, "insert: 在SQL Server中錄入一個用戶記錄");
    }

    public User getUser(int id){
        Log.d(TAG, "getUser: 在SQL Server中獲取一個用戶記錄");
        return null;
    }
}

客戶端調(diào)用

    User user = new User();
    user.setId(1);
    user.setName("Allever");
    SqlServerUser sqlServerUser = new SqlServerUser();
    sqlServerUser.insertUser(user);
    sqlServerUser.getUser(1);

如果換為MySQL數(shù)據(jù)庫改動就很多

使用工廠方法改進(jìn)

IUser接口

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

SqlServerUser類

public class SqlServerUser implements IUser {

    private static final String TAG = "SqlServerUser";
    @Override
    public void insertUser(User user){
        Log.d(TAG, "insert: 在SQL Server中錄入一個用戶記錄");
    }

    @Override
    public User getUser(int id){
        Log.d(TAG, "getUser: 在SQL Server中獲取一個用戶記錄");
        return null;
    }
}

MySQLUser類

public class MySQLUser implements IUser {
    private static final String TAG = "MySQLUser";
    @Override
    public void insertUser(User user){
        Log.d(TAG, "insert: 在MySQL Server中錄入一個用戶記錄");
    }

    @Override
    public User getUser(int id){
        Log.d(TAG, "getUser: 在MySQL Server中獲取一個用戶記錄");
        return null;
    }
}

IFactory抽象工廠接口

public interface IFactory {
    IUser createUser();
}

SqlServerFactory具體工廠類

public class SqlServerFactory implements IFactory {
    @Override
    public IUser createUser() {
        return new SqlServerUser();
    }
}

MySQLServerFactory具體工廠

public class MySQLServerFactory implements IFactory {
    @Override
    public IUser createUser() {
        return new MySQLUser();
    }
}

客戶端調(diào)用

        User user = new User();
        user.setId(1);
        user.setName("Allever");

        IFactory factory = new SqlServerFactory();
        IUser iUser = factory.createUser();
        iUser.insertUser(user);
        iUser.getUser(1);

如果改為MySQL數(shù)據(jù)庫,這改動這里

IFactory factory = new MySQLServerFactory();

使用抽象工廠

新增Department表

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

新增IDepartment接口

public interface IDepartment {
    void insertDepartment(Department department);
    Department getDepartment(int id);
}

新增SqlServerDepartment類

public class SqlServerDepartment implements IDepartment {
    private static final String TAG = "SqlServerDepartment";
    @Override
    public void insertDepartment(Department department) {
        Log.d(TAG, "insertDepartment: 在Sql Server 中插入Department");
    }

    @Override
    public Department getDepartment(int id) {
        Log.d(TAG, "insertDepartment: 在Sql Server 中獲取Department");
        return null;
    }
}

新增MySQLDepartment類

public class MySQLDepartment implements IDepartment {
    private static final String TAG = "MySQLDepartment";
    @Override
    public void insertDepartment(Department department) {
        Log.d(TAG, "insertDepartment: 在MySQL 中插入Department");
    }

    @Override
    public Department getDepartment(int id) {
        Log.d(TAG, "insertDepartment: 在MySQL 中獲取Department");
        return null;
    }
}

修改IFactory接口

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

修改SqlServerFactory類

public class SqlServerFactory implements IFactory {
    @Override
    public IUser createUser() {
        return new SqlServerUser();
    }

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

修改MySQLServerFactory類

public class MySQLServerFactory implements IFactory {
    @Override
    public IUser createUser() {
        return new MySQLUser();
    }

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

客戶端調(diào)用

        User user = new User();
        user.setId(1);
        user.setName("Allever");
        Department department = new Department();
        department.setId(1);
        department.setDeptName("Computer");

        IFactory factory = new MySQLServerFactory();
        IUser iUser = factory.createUser();
        iUser.insertUser(user);
        iUser.getUser(1);
        
        IDepartment iDepartment = factory.createDepartment();
        iDepartment.insertDepartment(department);
        iDepartment.getDepartment(1);

總結(jié)

只有一個User類和User操作類的時候,只需要工廠方法模式, 但現(xiàn)在數(shù)據(jù)庫中有很多表, 而SQL Server 和 MySQL 又是兩大不同的分類, 所以解決這種涉及到多個產(chǎn)品系列的時候,就要用到抽象工廠模式。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容