当前位置: 首页 > news >正文

《设计模式》抽象工厂模式

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
http://www.lryc.cn/news/624135.html

相关文章:

  • 数学建模-评价类问题-优劣解距离法(TOPSIS)
  • Python 调试工具的高级用法
  • HTTPS 配置与动态 Web 内容部署指南
  • Pycharm Debug详解
  • mysql建库规范
  • Grid系统概述
  • 佳文赏读 || (CVPR 2025新突破) Robobrain:机器人操作从抽象到具体的统一大脑模型(A Unified Brain Model)
  • 基于Python的旅游推荐系统 Python+Django+Vue.js
  • SVN客户端下载与安装
  • 在鸿蒙中实现深色/浅色模式切换:从原理到可运行 Demo
  • 力扣第463场周赛
  • C++---迭代器删除元素避免索引混乱
  • 轻松配置NAT模式让虚拟机上网
  • LeetCode热题100--104. 二叉树的最大深度--简单
  • JavaScript性能优化实战(四):资源加载优化
  • 记SpringBoot3.x + Thymeleaf 项目实现(MVC架构模式)
  • 【Unity3D实例-功能-拔枪】角色拔枪(二)分割上身和下身
  • TDengine IDMP 运维指南(1. 部署规划)
  • 大模型算法岗面试准备经验分享
  • 母猪姿态转换行为识别:计算机视觉与行为识别模型调优指南
  • Java试题-选择题(10)
  • AMBA-AXI and ACE协议详解(四)
  • 计算机毕业设计java的小天鹅酒店月子会所管理小天鹅酒店母婴护理中心管理系统设计小天鹅酒店产后护理会所信息化管理平台
  • 物联网软件开发过程中,数据流图(DFD),用例图,类图,活动图,序列图,状态图,实体关系图(ERD),BPMN(业务流程建模)详解分析
  • 嵌入式练习项目——————抓包获取天气信息
  • Python大模型应用开发-核心技术与项目开发
  • C++编程实战:高效解决算法与数据结构问题
  • Linux817 shell:until,nfs,random
  • React 第七十节 Router中matchRoutes的使用详解及注意事项
  • Next.js跟React关系(Next.js是基于React库的全栈框架)(文件系统路由、服务端渲染SSR、静态生成SSG、增量静态再生ISR、API路由)