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

    你可能感兴趣的文章
    NLog类库使用探索——详解配置
    查看>>
    NLP 基于kashgari和BERT实现中文命名实体识别(NER)
    查看>>
    NLP 模型中的偏差和公平性检测
    查看>>
    Vue3.0 性能提升主要是通过哪几方面体现的?
    查看>>
    NLP 项目:维基百科文章爬虫和分类【01】 - 语料库阅读器
    查看>>
    NLP_什么是统计语言模型_条件概率的链式法则_n元统计语言模型_马尔科夫链_数据稀疏(出现了词库中没有的词)_统计语言模型的平滑策略---人工智能工作笔记0035
    查看>>
    NLP三大特征抽取器:CNN、RNN与Transformer全面解析
    查看>>
    NLP学习笔记:使用 Python 进行NLTK
    查看>>
    NLP度量指标BELU真的完美么?
    查看>>
    NLP的不同研究领域和最新发展的概述
    查看>>
    NLP的神经网络训练的新模式
    查看>>
    NLP采用Bert进行简单文本情感分类
    查看>>
    NLP问答系统:使用 Deepset SQUAD 和 SQuAD v2 度量评估
    查看>>
    NLP项目:维基百科文章爬虫和分类【02】 - 语料库转换管道
    查看>>
    NLP:使用 SciKit Learn 的文本矢量化方法
    查看>>
    nmap 使用方法详细介绍
    查看>>
    Nmap扫描教程之Nmap基础知识
    查看>>
    nmap指纹识别要点以及又快又准之方法
    查看>>
    Nmap渗透测试指南之指纹识别与探测、伺机而动
    查看>>
    Nmap端口扫描工具Windows安装和命令大全(非常详细)零基础入门到精通,收藏这篇就够了
    查看>>