《设计模式》抽象工厂模式
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