文档章节

抽象工厂模式

骑着乌龟的蜗牛
 骑着乌龟的蜗牛
发布于 2015/09/12 17:19
字数 425
阅读 65
收藏 4

摘自:http://blog.csdn.net/zhangerqing/article/details/8194653

工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想拓展程序,就必须对工厂类进行修改,违背了闭包原则,从设计角度考虑,有一定问题,所以就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。因为抽象工厂不太好理解,先看图,再看代码,如下:

首先,建一个接口

public interface Sender {
   void send();
}


然后,创建实现类

public class MailSender implements Sender {
    @Override
    public void send() {
        System.out.println("this is mail sender");
  }
}

public class SmsSender implements Sender {
    @Override
    public void send() {
        System.out.println("this is sms sender");
    }
}

再创建一个接口,用来提供发送功能

public interface Provider {
    public Sender produce();
}

然后提供两个工厂类,生成特定发送功能

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

测试一下:

public class Main {
    public static void main(String[] args) {
        Provider provider = new SendMailFactory();
        Sender sender = provider.produce();
        sender.send();
    }
}

这个模式的好处就是,如果你现在想增加一个功能:发送及时消息,则只需做一个实现类,实现Sender 类,同时做一个工厂类,实现Provider 接口,就OK !无需去修改 现成的代码。

示例如下:

及时消息的实体类:

public class IMSender implements Sender {
    @Override
    public void send() {
        System.out.println("this is IM sender");
    }
}

实现 Provider 的 工厂类:

public class SendIMFactory implements Provider{
    @Override
    public Sender produce() {
        return new IMSender();
    }
}


测试一下:

public class Main {
    public static void main(String[] args) {
        Provider provider = new SendMailFactory();
        Sender sender = provider.produce();
        sender.send();
        provider = new SendIMFactory();
        sender = provider.produce();
        sender.send();
    }
}



本文转载自:http://blog.csdn.net/zhangerqing/article/details/8194653

上一篇: 抽象工厂模式
下一篇: Fragment 简单操作
骑着乌龟的蜗牛
粉丝 4
博文 20
码字总数 22788
作品 0
大兴
程序员
私信 提问

暂无文章

mysql-connector-java升级到8.0后保存时间到数据库出现了时差

在一个新项目中用到了新版的mysql jdbc 驱动 <dependency>     <groupId>mysql</groupId>     <artifactId>mysql-connector-java</artifactId>     <version>8.0.18</version> ......

ValSong
今天
5
0
Spring Boot 如何部署到 Linux 中的服务

打包完成后的 Spring Boot 程序如何部署到 Linux 上的服务? 你可以参考官方的有关部署 Spring Boot 为 Linux 服务的文档。 文档链接如下: https://docs.ossez.com/spring-boot-docs/docs/r...

honeymoose
今天
6
0
Spring Boot 2 实战:使用 Spring Boot Admin 监控你的应用

1. 前言 生产上对 Web 应用 的监控是十分必要的。我们可以近乎实时来对应用的健康、性能等其他指标进行监控来及时应对一些突发情况。避免一些故障的发生。对于 Spring Boot 应用来说我们可以...

码农小胖哥
今天
8
0
ZetCode 教程翻译计划正式启动 | ApacheCN

原文:ZetCode 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远。 ApacheCN 学习资源 贡献指南 本项目需要校对,欢迎大家提交 Pull Request。 ...

ApacheCN_飞龙
今天
5
0
CSS定位

CSS定位 relative相对定位 absolute绝对定位 fixed和sticky及zIndex relative相对定位 position特性:css position属性用于指定一个元素在文档中的定位方式。top、right、bottom、left属性则...

studywin
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部