博客
关于我
java设计模式(三)--抽象工厂模式
阅读量:463 次
发布时间:2019-03-06

本文共 1926 字,大约阅读时间需要 6 分钟。

工厂方法模式的局限性及抽象工厂模式的解决方案

在软件设计中,工厂方法模式(Factory Method)是一个常用的设计模式。它通过将对象的创建权从客户端转移到工厂类,实现了对象创建的抽象化。然而,这一模式存在一个明显的缺陷:当需要扩展程序功能时,通常需要修改工厂类的代码,这违背了闭包原则,降低了系统的扩展性。

为了解决这一问题,抽象工厂模式(Abstract Factory Pattern)提供了一种更为灵活的解决方案。通过创建多个工厂类,每个工厂类负责生产特定的产品。这种设计允许我们在不修改现有代码的情况下,通过添加新的工厂类来扩展系统功能。

接口与实现类的创建

在抽象工厂模式中,首先需要定义一个接口来规范生产的产品。以下是发送接口的定义:

public interface Sender {    public String send();}

接下来,实现该接口的两个具体类,分别对应不同的功能:

public class MailSender implements Sender {    @Override    public String send() {        System.out.println("This is emailSender!");        return "email";    }}public class SmsSender implements Sender {    @Override    public String send() {        System.out.println("This is SmsSender!!");        return "sms";    }}

工厂接口与实现类的创建

为了统一管理不同类型的发送器,我们需要定义一个工厂接口,规范工厂类的操作方式:

public interface Provider {    public Sender produce();}

然后,实现该工厂接口的两个具体类,分别对应不同的发送器类型:

public class MailSendFactory implements Provider {    @Override    public Sender produce() {        return new MailSender();    }}public class SmsSendFactory implements Provider {    @Override    public Sender produce() {        return new SmsSender();    }}

测试与验证

通过测试类可以验证工厂模式的实现是否正确:

public class ProviderTest {    private Provider provider;    @Test    public void testMailProduce() throws Exception {        provider = new MailSendFactory();        Sender sender = provider.produce();        assertEquals("email", sender.send());    }    @Test    public void testSmsProduce() throws Exception {        provider = new SmsSendFactory();        Sender sender = provider.produce();        assertEquals("sms", sender.send());    }}

上转型对象的概念

在抽象工厂模式中,上转型对象(Upcasting Object)是实现类与接口之间的桥梁。上转型对象具有以下特点:

  • 定义:上转型对象是指将一个对象赋值给一个基类或接口,基类可以调用子类继承或重写的方法。

  • 特点

    • 可以操作子类继承或重写的成员变量和方法。
    • 可以调用子类新增加的方法。
    • 可以通过强制转换获得子类的全部属性和功能。
  • 注意事项

    • 接口定义的权限应设置为public,因为继承体系的权限不能缩小。
    • 子类或实现类赋值给基类时,基类只能操作基类自身和子类重写的部分。
  • 抽象工厂模式通过上转型对象的实现,实现了系统的高扩展性和灵活性,充分发挥了闭合性原则的优势。这种设计方式在需要频繁扩展功能或维护不同实现类的情况下,展现出显著的优势。

    转载地址:http://wqfbz.baihongyu.com/

    你可能感兴趣的文章
    opencv_core.dir/objects.a(vs_version.rc.obj)‘ is incompatible with i386:x86-64 output
    查看>>
    opencv——图像缩放1(resize)
    查看>>
    opencv——最简单的视频读取
    查看>>
    Opencv——模块介绍
    查看>>
    OpenCV与AI深度学习 | 2024年AI初学者需要掌握的热门技能有哪些?
    查看>>
    OpenCV与AI深度学习 | CIB-SE-YOLOv8: 优化的YOLOv8, 用于施工现场的安全设备实时检测 !
    查看>>
    OpenCV与AI深度学习 | CoTracker3:用于卓越点跟踪的最新 AI 模型
    查看>>
    OpenCV与AI深度学习 | OpenCV中八种不同的目标追踪算法
    查看>>
    OpenCV与AI深度学习 | OpenCV图像拼接--Stitching detailed使用与参数介绍
    查看>>
    OpenCV与AI深度学习 | OpenCV如何读取仪表中的指针刻度
    查看>>
    OpenCV与AI深度学习 | OpenCV常用图像拼接方法(一) :直接拼接
    查看>>
    OpenCV与AI深度学习 | OpenCV常用图像拼接方法(三):基于特征匹配拼接
    查看>>
    OpenCV与AI深度学习 | OpenCV常用图像拼接方法(二) :基于模板匹配拼接
    查看>>
    OpenCV与AI深度学习 | OpenCV常用图像拼接方法(四):基于Stitcher类拼接
    查看>>
    OpenCV与AI深度学习 | OpenCV快速傅里叶变换(FFT)用于图像和视频流的模糊检测(建议收藏!)
    查看>>
    OpenCV与AI深度学习 | PaddleOCR 2.9 发布, 正式开源文本图像智能分析利器
    查看>>
    OpenCV与AI深度学习 | SAM2(Segment Anything Model 2)新一代分割一切大模型介绍与使用(步骤 + 代码)
    查看>>
    OpenCV与AI深度学习 | T-Rex Label !超震撼 AI 自动标注工具,开箱即用、检测一切
    查看>>
    OpenCV与AI深度学习 | YOLO11介绍及五大任务推理演示(目标检测,图像分割,图像分类,姿态检测,带方向目标检测)
    查看>>
    OpenCV与AI深度学习 | YOLOv10在PyTorch和OpenVINO中推理对比
    查看>>