抽象工厂模式

Java实现抽象工厂模式 抽象工厂模式提供一个创建一系列相关或者相互依赖对象的接口。 阅读详情

定义:
抽象工厂模式是一种创建型模式,意图是“提供一个创建一系列相关或相互依赖对象的接口,而不需要指定它们具体的类”。(《Design Patterns》GOF)

逻辑:

 

项目需求:
现在我们要设计一个人事管理系统(PESY),因为该项目需要向很多的单位提供,我们在数据库方面考虑使用SQL SERVER来设计。现在来看看其中数据方面的一些实现。
public class SqlEmployee
{
    /// <summary>
    /// 查询一个员工的信息
    /// </summary>
    public EmployeeModel Select(string employeeId)
    {
        //......SQL SERVER操作
        return new EmployeeModel();
    }
    /// <summary>
    /// 删除一个员工
    /// </summary>
    public bool Delete(string employeeId)
    {
        //.....SQL SERVER操作
        return true;
    }
}

/// <summary>
/// 客户调用
/// </summary>
public class PESY
{
    public static void Main(string[] args)
    {
        SqlEmployee employee = new SqlEmployee();
        employee.Delete("010101");//删除一个员工人事信息。
    }
}
我们知道,不同的数据库的SQL语句会有一些不同,有的数据库可以使用存储过程,视图等等,而有的数据库不支持。
下面我们的需求改变了,一个省级人事机构要使用我们的项目,数据量和更新相当的大,这样我们得考虑到使用大型的关系型数据库,这里我们使用Oracle来改变需求。
public class OracleEmployee
{
    /// <summary>
    /// 查询一个员工的信息
    /// </summary>
    public EmployeeModel Select(string employeeId)
    {
        //......Oracle操作
        return new EmployeeModel();
    }
    /// <summary>
    /// 删除一个员工
    /// </summary>
    public bool Delete(string employeeId)
    {
        //.....Oracle操作
        return true;
    }
}

/// <summary>
/// 客户调用
/// </summary>
public class PESY
{
    public static void Main(string[] args)
    {
        OracleEmployee employee = new OracleEmployee();
        employee.Delete("010101");//删除一个员工人事信息。其实应该有很多的客户操作。
    }
}

很好,看上去我们已经满足了客户的需求。但是如果我们需要更多的数据库类型,就的编写不同数据库操作层,最让我们无法接受的是,我们每次必须去重写 客户端的调用方法,我们不得不每次都委派技术人员到给客户进行调试,客户无法自己进行相关配置,这已经违背的我们学习设计模式的初衷。
那么让我们在仔细分析一下我们的系统。
当每次客户需求改变时,我们就需要考虑数据库是否能够承受客户的需求。目前需求冲突的部分是我们每次都必须修改客户调用部分。我们每次都要为客户进行部署。但是我们发现,在数据库操作层里,他们都用相同的方法名,相同的公共属性,那么我们可能想到可以提取这些接口。
public interface IEmployee
{
    EmployeeModel Select(string employeeId);
    bool Delete(string employeeId);
}
然后其余的数据库操作类实现这个接口,这样我们就同一类面向接口编程的模型。在来看看我们的客户端现在应该怎么写。
/// <summary>
/// 客户调用
/// </summary>
public class PESY
{
    public static void Main(string[] args)
    {
        IEmployee employee = new SqlEmployee();
        employee.Delete("010101");//删除一个员工人事信息。
    }
}
我们提取了公共的接口,但是发现好像并没有像我们想想中的一样解决什么问题。因为我们一旦改变的数据库,我们仍然需要改变客户端调用,进行部署。现在我们可以考虑为项目增加一个Factory工厂类。
public class Factory
{
    public static IEmployee CreateEmployee()
    {
        return new SqlEmployee();
    }
}
再来看看客户端的调用
/// <summary>
/// 客户调用
/// </summary>
public class PESY
{
    public static void Main(string[] args)
    {
        IEmployee employee = Factory.CreateEmployee();
        employee.Delete("010101");//删除一个员工人事信息。
    }
}

好像我们已经解决了一个很大的问题,现在如果需求改变为另外一个数据库,就不用在重新部署客户端的调用部分,而只用简单的改变factory里的返 回类。但是我们真正项目的factory可定不会像例子里这么少的一个对象,也许会有几十个,随着系统的升级,甚至可能会增加到几百个。如果我们每次需求 改变都需要这样一个一个来替换,那是多么烦人的一件事情,让我们来解决这个问题,重写这个factory,这里会使用到.NET的反射机制,和配置文件。
public class Factory
{
    private static readonly string path = ConfigurationManager.AppSettings["DAL"];
    public static IEmployee CreateEmployee()
    {
        string className = path + ".Employee";
        return (IEmployee)Assembly.Load(path).CreateInstance(className); //通过反射机制来动态加载
    }
}
配置文件
<appSettings>
    <add key="DAL" value="PESY.SQLServerDAL"/>
</appSettings>
这里每次我们只需要在配置文件里指定需要加载的DLL就OK了,现在如果客户需求改变,我们只需要把相应数据库操作类提供给客户,然后更改一下配置就完成了项目,这是不是很奇妙?

总结:为什么把Abstract Factory放在第一个类写,因为抽象工厂模式是面向接口编程的,这也是面向对象编程的精华部分。其实我这个例子在抽象工厂中应该还存在一些抽象的公共 方法,例如计算员工的工资等等,这些都是可行的。不过我认为现在的例子也已经能够完全表现出面向接口编程的工厂模式。太多太复杂的逻辑反倒让整个思路很杂 乱。大家不妨下载微软的一个.NET示例PetShop4.0,里面对工厂模式使用颇多。最后总结一点,抽象工厂模式主要是解决项目中的对象创建,我们通 常使用工厂模式来封装同类的对象创建。

通信原理 | 窗函数 | 矩形窗 | 汉宁窗 | 汉明窗 | 布莱克曼窗 | 补零对频谱的影响 比如,原信号是一个周期的余弦信号,又给它补了9个周期长度的0,那么信号并不是10个周期的余弦信号,而是一个周期的余弦加一串0,补零并没有带来新的信息!频谱分辨率的含义是两个频率不同的信号在频率上可分,也就要求他们不能落到一个频域函数的主瓣上,所以,如果待分析的两个信号频率接近,而时域长度又短,那么在频域上他们就落在一个频域函数的主瓣内了,补再多的零也无济于事。而形状(主瓣宽度)是由补零之前的信号长度决定的,补零的作用只是细化了频域序列,并没有改变其主瓣宽度。所以,汉宁窗牺牲了分辨率,换来了旁瓣泄露的减小。 阅读详情

相关推荐

告别轮询!手把手教你用S32K3的FlexCAN Enhanced FIFO+DMA实现高效CAN FD数据接收

本文详细介绍了如何利用S32K3芯片的FlexCAN Enhanced FIFO与DMA组合方案,实现高效CAN FD数据接收,彻底告别传统轮询和中断模式。通过深度缓冲、智能过滤和DMA联动技术,该方案在5Mbps高负载场景下将CPU占用率从42%降至3%以下,显著提升系统实时性和吞吐量。

weixin_30906185的博客 502

对抽象工厂模式的理解

小明家新开了两个工厂用来生产家具,一个生产现代风格的沙发和椅子,一个生产古典风格的沙发和椅子,现在工厂收到了一笔订单,请你帮他设计一个系统,描述订单需要生产家具的信息。接下来的 N 行,每行输入一个字符串,字符串表示家具的类型。家具类型分为 “modern” 和 “classical” 两种。对于应用层,需要操作按钮和复选框,前提是获取对应的对象。而不同操作系统,返回的对象应该不同。输入的第一行是一个整数 N(1 ≤ N ≤ 100),表示订单的数量。对于每笔订单,输出字符串表示该订单需要生产家具的信息。

南七行者的博客 1053

SAP PO开发-端到端配置

1.登录PO系统,选择system landscape,将外围系统的系统信息(Software Component以下简称SC)注册到PO系统中。2.点击products注册外围系统信息。3.选择New 新建 按钮:创建一个新的系统和版本。4.输入产品名称、供应商、版本号等信息。然后点击:Next。5.设置instance 名称,然后点击Next。6.最后设置软件组件的名称,然后点击Finish。

P9QCer的博客 1577

抽象工厂模式学习总结

抽象工厂模式 引言 工厂模式是抽象工厂模式特例,在工厂模式中,一个工厂对应一个产品,在抽象工厂模式中,一个工厂对应N个产品,当N=1时,抽象工厂模式就退化成了工厂模式。 抽象工厂模式重要等级★★★★★ 抽象工厂模式难度等级★★★★☆ 定义 英文定义:"Provide an interface...

江川的博客 3545

【Ubuntu2404】Ubuntu24.04安装NVIDIA驱动/CUDA/cuDNN搭建神经网络训练环境

NVIDIA 驱动、CUDA和cuDNN是紧密相关但各自具有独特功能的技术,它们共同为图形处理单元(GPU)加速的应用程序提供了强大的支持。本文主要介绍如何安装 `NVIDIA` 驱动、CUDA及cuDNN,为后续神经网络训练提供支持。本文主要介绍Ubuntu24.04安装NVIDIA驱动、CUDA和cuDNN的流程。

王阿巴和王咕噜 1万+

Visual Studio 2022 社区版安装指南:从下载到配置的完整流程

本文详细介绍了Visual Studio 2022社区版的完整安装与配置流程,包括系统要求检查、官方下载步骤、工作负载选择、安装位置配置等关键环节。作为微软推出的免费集成开发环境,VS2022社区版支持多种编程语言,适合个人开发者和小型团队使用。文章还提供了常见问题解决和性能优化技巧,帮助用户高效完成开发环境搭建。

weixin_28829339的博客 880

常用设计模式——抽象工厂模式

本篇博客给大家介绍常用设计模式中的抽象工厂模式。本节要介绍的抽象工厂模式将考虑多等级产品的生产,将同一个具体工厂所生产的位于不同等级的一组产品称为一个产品族。

weixin_45676761的博客 4935

5实践报告撰写

一 项目流程 明确标准 确定分析目标 寻找分析数据 清洗数据 描述性分析 诊断性分析 提出建议 撰写报告 二 确定分析目标 什么是你感兴趣的? 什么是你熟悉的? 什么是你擅长的? 1 电商零售行业 商品销量分析 价格分析 评价分析 ...... 2 自媒体行业 广告投放力度分析 广告投放回报分析 不同类型的产品分析 ...... 3 金融行业 股票价格分析 信贷业务违约分析 客户画像分析 ...... ...

waywardG的博客 2832

java中抽象工厂模式_抽象工厂模式(详解版)

前面介绍的工厂方法模式中考虑的是一类产品的生产,如畜牧场只养动物、电视机厂只生产电视机、计算机软件学院只培养计算机软件专业的学生等。同种类称为同等级,也就是说:工厂方法模式只考虑生产同等级的产品,但是在现实生活中许多工厂是综合型的工厂,能生产多等级(种类) 的产品,如农场里既养动物又种植物,电器厂既生产电视机又生产洗衣机或空调,大学既有软件专业又有生物专业等。本节要介绍的抽象工厂模式将考虑多等级产...

weixin_35823048的博客 2282

喷涂机器人系列编程:ABB IRB 5500_(9).常见故障诊断与排除

ABB IRB 5500 喷涂机器人在实际应用中可能会遇到各种故障,但通过系统的诊断和排除方法,可以确保生产线的连续运行。定期维护和保养是预防故障的重要手段,而操作培训和规范则能有效减少人为因素引起的故障。希望本节内容能帮助操作和维护人员提高故障诊断和排除的效率,确保喷涂机器人的稳定运行。如果您有任何疑问或需要进一步的帮助,请联系 ABB 客户服务中心。

zhubeibei168的博客 1045

【人工智能】《Deep Dive into LLMs like ChatGPT 》—— Andrej Karpathy 第三阶段:强化学习(Reinforcement Learning, RL)

摘要:强化学习(RL)阶段通过让模型自主生成并验证答案,突破SFT阶段的模仿局限,使其在数学、代码等领域形成独特的推理路径。RL流程包括批量生成解答、自动批改筛选正确路径,并采用PPO/GRPO算法优化模型。模型会自发涌现自我检查、回滚等策略,显著提升正确率(如AIME竞赛准确率从15%升至56%)。与SFT模型相比,RL模型具备主动链式思维、验算能力,响应时间更长但效果更优,形成真正的“思考模型”。三阶段对比显示,RL通过可验证题的对错奖励机制,赋予模型超越人类范式的推理能力。

奶爸的编程之路,也就一周冷个三天 149

抽象工厂模式详解

抽象工厂模式 模式动机与定义 模式动机 产品等级结构:产品等级结构即产品的继承结构,例如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是其子类。 产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,例如海尔电器工厂生产的海尔电视机、海...

泰斗贤若如的博客 1046

YOLOv11改进缝合注意力 | 深度优化的BiFormer模型-结合BiLevel Routing Attention与深度可分离卷积的创新应用(附代码)

YOLO(You Only Look Once)系列目标检测算法一直以来都是计算机视觉领域的热门选择。随着YOLOv11的发布,它在许多实际应用场景中取得了显著的性能提升。然而,面对日益复杂的目标检测任务,单纯依赖卷积神经网络(CNN)在某些情况下已经显得力不从心,特别是在处理小尺度、密集目标以及遮挡目标时,卷积操作的局部性限制了模型的表达能力。

一键难忘的博客 716
上一篇: 我运用电子商务五年的经验分享
下一篇: Windows Server 2008+IIS 7+ASP.NET支持10万个同时请求
LOVE_NET_HCF
博客等级 码龄18年 4粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值