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

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

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.xdnf.cn/news/18215.html

相关文章:

  • 24. 什么是不可变对象,好处是什么
  • 适用监测农作物长势和病虫害的高光谱/多光谱相机有哪些?
  • 【网络通信】TCP/IP 协议全方位解析​
  • 【LeetCode】12. 整数转罗马数字
  • STM32——软硬件I2C
  • 8月17日星期天今日早报简报微语报早读
  • 解锁Java开发神器:XXL-Job从入门到精通
  • java如何使用正则提取字符串中的内容
  • Go语言实战案例-使用ORM框架 GORM 入门
  • Centos 更新/修改宝塔版本
  • GaussDB 数据库架构师修炼(十三)安全管理(5)-全密态数据库
  • 【架构师从入门到进阶】第五章:DNSCDN网关优化思路——第十二节:网关安全-信息过滤
  • 哈希表与unorder_set,unorder_map的学习
  • 【Linux系列】常见查看服务器 IP 的方法
  • 深入了解 Filesystem Hierarchy Standard (FHS) 3.0 规范
  • 17.5 展示购物车缩略信息
  • 【Linux】文件基础IO
  • Google Earth Engine | (GEE)逐月下载的MODIS叶面积指数LAI
  • Rust 入门 生命周期(十八)
  • 【牛客刷题】字符串按索引二进制1个数奇偶性转换大小写
  • C#高级语法_委托
  • java基础(十)sql的mvcc
  • 字节 Golang 大模型应用开发框架 Eino简介
  • 进程互斥的硬件实现方法
  • 私人AI搜索新突破:3步本地部署Dify+Ollama+QwQ,搜索能力MAX
  • 《动手学深度学习v2》学习笔记 | 1. 引言
  • Nacos 注册中心学习笔记
  • C++入门自学Day11-- String, Vector, List 复习
  • Kafka 面试题及详细答案100道(23-35)-- 核心机制2
  • 3D打印——给开发板做外壳