1.抽象工廠模式定義
抽象工廠模式(Abstact Factory ): 提供一個創建一系列相關或者相互依賴對象的接口,而無須指定它們具體的類。
1.1 UML圖:
2.抽象工廠模式舉例:
業務場景:需要實現一個數據訪問程序。
- 要求支持兩種訪問方式 access 和 sqlserver
- 支持兩張表 User表和department表
2.1 UML圖:
2.2 核心代碼:
IFactory接口
public interface IFactory {public IUser createUser();public IDepartment createDepartment();}
IUser接口
public interface IUser {public void insert(User user);public User getUser(int id);
}
IDepartment接口
public interface IDepartment {public void insert(Department department);public Department getDepartment(int id);
}
AccessFactory
public class AccessFactory implements IFactory {public IUser createUser(){return new AccessUser();}public IDepartment createDepartment(){return new AccessDepartment();}}
SqlserverFactory
public class SqlserverFactory implements IFactory {public IUser createUser(){return new SqlserverUser();}public IDepartment createDepartment(){return new SqlserverDepartment();}}
AccessUser
public class AccessUser implements IUser {//新增一個用戶public void insert(User user){System.out.println("在Access中給User表增加一條記錄"); }//獲取一個用戶信息public User getUser(int id){System.out.println("在Access中根據用戶ID得到User表一條記錄"); return null; }}
SqlserverUser
public class SqlserverUser implements IUser {//新增一個用戶public void insert(User user){System.out.println("在SQL Server中給User表增加一條記錄"); }//獲取一個用戶信息public User getUser(int id){System.out.println("在SQL Server中根據用戶ID得到User表一條記錄"); return null; }}
AccessDepartment
public class AccessDepartment implements IDepartment {//新增一個部門public void insert(Department department){System.out.println("在Access中給Department表增加一條記錄"); }//獲取一個部門信息public Department getDepartment(int id){System.out.println("在Access中根據部門ID得到Department表一條記錄"); return null; }}
SqlserverDepartment
public class SqlserverDepartment implements IDepartment {//新增一個部門public void insert(Department department){System.out.println("在SQL Server中給Department表增加一條記錄"); }//獲取一個部門信息public Department getDepartment(int id){System.out.println("在SQL Server中根據部門ID得到Department表一條記錄"); return null; }
}
User
public class User {//用戶IDprivate int _id;public int getId(){return this._id;}public void setId(int value){this._id=value;}//用戶姓名private String _name;public String getName(){return this._name;}public void setName(String value){this._name=value;}}
Department
public class Department {//部門IDprivate int _id;public int getId(){return this._id;}public void setId(int value){this._id=value;}//部門名稱private String _name;public String getName(){return this._name;}public void setName(String value){this._name=value;}}
Client
public class Client {public static void main(String[] args){System.out.println("**********************************************"); System.out.println("抽象工廠模式");System.out.println(); 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); //得到用戶ID為1的用戶信息IDepartment idept = factory.createDepartment();idept.insert(department); //新增一個部門idept.getDepartment(2); //得到部門ID為2的用戶信息System.out.println();System.out.println("**********************************************");}
}
輸出結果:
3. 抽象工廠模式的優缺點;
3.1 優點
- 靈活性和可擴展性:
- 抽象工廠模式允許系統在不修改現有代碼的基礎上引入新的產品族,提高了系統的可擴展性。
- 解耦:
- 客戶端代碼與具體工廠實現解耦,降低了模塊間的依賴。
- 一致性:
- 確保了產品族中的對象是一起創建的,從而保證了對象之間的一致性。
3.2 缺點
- 系統復雜度增加:
- 每增加一個新的產品族,都需要增加一個新的具體工廠類和產品類,可能會導致系統中類的數量急劇增加。
- 難以維護:
- 隨著產品族的增加,抽象工廠模式可能會導致系統結構變得更加復雜,難以理解和維護。
- 不夠靈活:
- 如果系統需要支持多種產品族的任意組合,抽象工廠模式可能不如其他模式(如建造者模式)靈活。
6. 總結
抽象工廠模式(Abstact Factory ): 提供一個創建一系列相關或者相互依賴對象的接口,而無須指定它們具體的類。
7.參考
- https://cloud.tencent.com/developer/article/2478362
- https://blog.csdn.net/m0_46248770/article/details/149914634