【前言】

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

【特点】
  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. 做一个有产品思维的研发:部署(Tomcat配置,Nginx配置,JDK配置)

    每天10分钟,解决一个研发问题. 如果你想了解我在做什么,请看<做一个有产品思维的研发:课程大纲>传送门:https://www.cnblogs.com/hunttown/p/104909 ...

  2. How to use draggable attribute?怎样使用拖拽属性代码分享

    6.7 Drag and dropSupport: dragndropChrome for Android NoneChrome 4+iOS Safari 11.0+UC Browser for An ...

  3. WatchDirService 实时监控

    import config.Config; import java.io.IOException; import java.nio.file.*; import java.util.List; imp ...

  4. 小程序使用npm

    1.cmd进入小程序的目录,cd C:\Users\lenovo\WeChatProjects\SITfu 2.npm install 3.npm init 4.npm install minipro ...

  5. 文件 "c:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\DATA\ttt.mdf" 已压缩,但未驻留在只读数据库或文件组中。必须将此文件解压缩。 CREATE DATABASE 失败。无法创建列出的某些文件名。请查看相关错误。 (.Net SqlClient Data Provider)

    问题: 文件 "c:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\DATA\ttt.mdf" 已压缩,但 ...

  6. Excel坐标自动在AutoCad绘图_4

    众所周知,Excel对数据处理的功能非常强大,它可以进行数据处理.统计分析已经辅助决策的操作,该软件已经渗透到各个领域.作为一个测绘人,GISer, 也经常利用excel完成一些测量表格的自动化计算, ...

  7. ubuntu 下安装 navicat 12

    一.去官网下载navicat112_premium_cs_x64 for linux版本二.用tar解压安装包三.navicat解压即可用,直接进入解压后的目录,然后用‘./’运行start_navi ...

  8. Python hasattr() 函数

    hasattr() 函数用于判断对象是否包含对应的属性.(has attribute) hasattr(object, name) 参数 object -- 对象. name -- 字符串,属性名. ...

  9. Oracle的问题的解决

    关于数据库的数据的导入导出       1.建数据库 修改密码的有效天数为无限期.       2.建表空间       3.建用户 导数据之前要建用户 要登进去试试 如themis_yw themi ...

  10. Scrum Meeting 合集

    一.Alpha [Alpha]Scrum meeting 1 [Alpha]Scrum meeting 2 [Alpha]Scrum meeting 3 [Alpha]Scrum meeting 4 ...