【前言】

很多时候我们编写了好几个接口的实现类,这些实现类分别有不同特性,用在不同的情景下。而我们对于这些实现类,也往往不会对外暴露内部增加的方法,只希望外部调用接口的方法,在这种情况下,我们没必要让调用者知道实现类,只需要提供一个方法让调用者使用从而创建具有不同特性的接口实例。而这个方法我们通常写在一个叫工厂类的类里面,从而对应这个接口,这样调用者可以根据自身需要选择具有不同特性的接口实例,又避免了实现类和外部调用者耦合的问题。

【特点】
  1. 工厂模式属于创建型的设计模式(用于创建对象),由工厂对象提供方法创建接口的实例。

  2. 在工厂模式中,创建对象时不会对外暴露创建逻辑,即外部不知道创建出来的实际类型是什么。

  3. 一个接口对应一个工厂类(一个接口伴随一个工厂类),可以归纳为一对一关系。

【适用】
  1. 只提供接口实例给外部使用,而且外部只能使用接口的方法,否则工厂模式不适合。

  2. 对外提供的接口有两个以上的不同实现方式(运行特性不同),否则工厂模式不合适。

【例子】

有一个需求,需要向外部提供一个日志打印器,根据不同情况,可以在服务器打印,本地打印,控制台打印日志。

这里我们先定义一个接口Logger:

public interface Logger{
    public void log(String text);
}

根据上面所说的,也有一个工厂类对应:

public Logger getLogger(String type){
    if(type.equals("server")){
        return new ServerLogger();
    }else if(type.equals("file")){
        return new FileLogger();
    }else if(type.equals("local")){
        return new LocalLogger();
    }
    return null;
}
【实例】

在Android开发中,通常我们都会有图片上传的需求。曾经有次经历过这样的需求,图片上传到服务器中然后返回图片路径(用于后面的接口作为其中一个Post参数),后来业务变更了,接入第三方图片上传存储服务,也是调用SDK上传图片返回图片路径。

这个时候就很合适使用工厂模式来适应这种业务变更,首先定义一个图片上传接口,通过工厂类获得不同的图片上传对象。这样如果以后图片上传业务再次变更,那么只需要在工厂类内部增加创建新实例的逻辑,外部只需要修改创建实例的方法的传入参数。

代码场景:

// 原来代码
PicInterface pic = PicFacetory.getPic("OriginServer");
// 新代码
PicInterface pic = PicFacetory.getPic("ThirdPartSDK");
// 上传,upload方法是实现接口的方法
String url = pic.upload(fileObj);

【设计模式】工厂模式(Factory Pattern)的更多相关文章

  1. 设计模式 - 工厂模式(factory pattern) 具体解释

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u012515223/article/details/27081511 工厂模式(factory pa ...

  2. 23种设计模式--工厂模式-Factory Pattern

    一.工厂模式的介绍       工厂模式让我们相到的就是工厂,那么生活中的工厂是生产产品的,在代码中的工厂是生产实例的,在直白一点就是生产实例的类,代码中我们常用new关键字,那么这个new出来的实例 ...

  3. 设计模式 - 出厂模式(factory pattern) 详细说明

    出厂模式(factory pattern) 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/details/27081511 工厂方法模式 ...

  4. python 设计模式之工厂模式 Factory Pattern (简单工厂模式,工厂方法模式,抽象工厂模式)

    十一回了趟老家,十一前工作一大堆忙成了狗,十一回来后又积累了一大堆又 忙成了狗,今天刚好抽了一点空开始写工厂方法模式 我看了<Head First 设计模式>P109--P133 这25页 ...

  5. 【设计模式】工厂模式 Factory Pattern

    1)简单工厂(不是模式) 简单工厂只是一种变成习惯,并非23种设计模式之一. 简单工厂提供将实例话那种类型留给运行时判断,而非编译时指定.简单工厂模式就是由一个工厂类根据传入的参数决定创建出哪一个类的 ...

  6. JAVA设计模式之工厂模式—Factory Pattern

    1.工厂模式简介 工厂模式用于对象的创建,使得客户从具体的产品对象中被解耦. 2.工厂模式分类 这里以制造coffee的例子开始工厂模式设计之旅. 我们知道coffee只是一种泛举,在点购咖啡时需要指 ...

  7. 创建型模式篇(工厂模式Factory Pattern)

    一.工厂模式(Factory Pattern) 1.定义: 在软件系统,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口.提供一种封 ...

  8. [设计模式]工厂模式factory

    参考:http://wxg6203.iteye.com/blog/740229 简单工厂模式(simple factory)是类的创建模式,又叫静态工厂方法(static factory method ...

  9. 大话设计模式--工厂模式 factory -- C++实现实例

    实现<大话设计模式>的C++版本... 1. 工厂模式 使用的范围是 同一个基类,下面很多子类. (1)这里很容易出现的一个问题n多的子类继承自抽象基类,我们不得不在每次要用到子类的地方就 ...

  10. 设计模式--工厂模式Factory(创建型)

    工厂模式属于创建型模式,分为三类,简单工厂模式.工厂方法模式.抽象工厂模式. 一.简单工厂模式 在工厂中做判断,根据产品类型从而创造相应的产品,当增加新产品时需要修改工厂类. 例如: enum CTY ...

随机推荐

  1. locust压测websocket协议

    Locust是以HTTP为主要目标构建的. 但是,通过编写触发器request_success和 request_failure事件的自定义客户端,可以轻松扩展到任何基于请求/响应的系统的负载测试 . ...

  2. 6#day2总结

    一次小小的总结https://github.com/DuGuQiuBai/Java/blob/master/day02/day02%E6%80%BB%E7%BB%93.txt 1:常量(掌握) (1) ...

  3. dom渲染方面的优化浅谈

    今天分享一个面试经验,上周面试中一位印象很深的面试官(主要长得很帅),问我了一个我至今印象很深刻的问题,当然不是什么你之后的职业规划啊,你工作中遇到过哪些问题啊之类的.原起于一道面试题,小伙伴们可以想 ...

  4. linux 笔记 第一天

    打开终端:ctrl+alt+t 清屏:ctrl+l 在终端在退出锁定:ctrl+c 目录:又称为文件夹,是包含所有的文件 目录创建规则: 1.大小是256 2.不能包含特殊字符 3.见名知义 路径:是 ...

  5. https----------如何在phpstudy环境下配置apache的https访问以及访问http自动跳转成https

    1.首先在 httpd.conf里面修改几个地方 找到 #LoadModule ssl_module modules/mod_ssl.so 去掉前面的# Include conf/vhosts.con ...

  6. Sed工作原理

    Sed工作原理   sed是一个非交互式的流编辑器.所谓非交互式,是指使用sed只能在命令行下输入编辑命令来编辑文本,然后在屏幕上查看输出:而所谓流编辑器,是指sed每次只从文件(或输入)读入一行,然 ...

  7. Linux替换文件内容sed命令

    sed -e 4a\newline testfile  //在第四行后添加一行,并将结果输出到标准输出.-e,以指定脚本处理文本文件:a,新增. nl /etc/passwd | sed '2,5d' ...

  8. Linux基础命令---iostat显示设备状态

    iostat iostat指令用来显示cpu状态,系统IO设备的状态,以及相关磁盘和NFS使用状态.iostat命令通过观察设备相对于其平均传输速率的活动时间来监视系统输入/输出设备负载.iostat ...

  9. @Conditional 原理

    1,这里讲的是:org.springframework.context.annotation.Conditional 2,在springConfig文件里注册bean @Conditional(Col ...

  10. react初始

    一.一些基础概念 1.框架:基于整个项目的 2.库:在某个模块中单独使用,轻量级的 在vue中,DOM的操作时DOM指令调用js 在react中,所有的DOM 渲染都是由JS完成的 组件基于视图 模块 ...