博客
关于我
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/

    你可能感兴趣的文章
    PLC中的电子凸轮的简单介绍
    查看>>
    PLC发展详解-ChatGPT4o作答+匹尔西
    查看>>
    PLC探针有什么用
    查看>>
    PLC接线详解
    查看>>
    PLC数组的使用(西门子)
    查看>>
    Quarzt定时调度任务
    查看>>
    PLC结构体(西门子)
    查看>>
    PLC编程语言ST文本语法的常用数据类型及变量
    查看>>
    PLC通讯方式
    查看>>
    Please install 'webpack-cli' in addition to webpack itself to use the CLI
    查看>>
    Ploly Dash,更新一个Dash应用程序JJJA上的实时人物
    查看>>
    Ploly烛台的定制颜色
    查看>>
    Ploly:如何在Excel中嵌入完全交互的Ploly图形?
    查看>>
    plotloss记录
    查看>>
    Plotly (Python) 子图:填充构面和共享图例
    查看>>
    Plotly 中的行悬停文本
    查看>>
    Plotly 停用 x 轴排序
    查看>>
    Plotly 域变量解释(多图)
    查看>>
    Plotly 绘制表面 3D 未显示
    查看>>
    Plotly-Dash 存在未知问题并创建“加载依赖项时出错“;通过使用 Python-pandas.date_range
    查看>>