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

本文共 1968 字,大约阅读时间需要 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/

    你可能感兴趣的文章
    nginx+Tomcat性能监控
    查看>>
    nginx+uwsgi+django
    查看>>
    Nginx-http-flv-module流媒体服务器搭建+模拟推流+flv.js在前端html和Vue中播放HTTP-FLV视频流
    查看>>
    nginx-vts + prometheus 监控nginx
    查看>>
    Nginx下配置codeigniter框架方法
    查看>>
    Nginx之二:nginx.conf简单配置(参数详解)
    查看>>
    Nginx代理websocket配置(解决websocket异常断开连接tcp连接不断问题)
    查看>>
    Nginx代理初探
    查看>>
    nginx代理地图服务--离线部署地图服务(地图数据篇.4)
    查看>>
    Nginx代理外网映射
    查看>>
    Nginx代理模式下 log-format 获取客户端真实IP
    查看>>
    Nginx代理静态资源(gis瓦片图片)实现非固定ip的url适配网络环境映射ip下的资源请求解决方案
    查看>>
    Nginx代理静态资源(gis瓦片图片)实现非固定ip的url适配网络环境映射ip下的资源请求解决方案
    查看>>
    Nginx反向代理与正向代理配置
    查看>>
    Nginx反向代理是什么意思?如何配置Nginx反向代理?
    查看>>
    nginx反向代理解决跨域问题,使本地调试更方便
    查看>>
    nginx启动脚本
    查看>>
    Nginx在Windows下载安装启动与配置前后端请求代理
    查看>>
    Nginx多域名,多证书,多服务配置,实用版
    查看>>
    nginx开机启动脚本
    查看>>