【前言】

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

【特点】
  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. JavaScript监控页面input输入整数且只能输入2位小数

    <input type="text" id="money" /> <script> $(function () { $('#money' ...

  2. Ribbon标题语句

    感谢每一次成长的喜悦和感动,谢谢一路有你!我会比从前更爱你,希望     你能陪我走过这一生!网址:http://www.uc123.com/

  3. TerminateProcess实现关闭任意程序

    #include <Windows.h> #include <tchar.h> int WINAPI _tWinMain(HINSTANCE hInstance, HINSTA ...

  4. Linux程序性能分析和火焰图

    Linux程序性能分析和火焰图 Linux程序的性能分析工具数量比较多,涉及到整个操作系统的方方面面,可能是开源的原因吧,相对于Windows来说丰富太多.其中应用分析性能方面Dtrace, Syst ...

  5. 201903<<高效15法则>>

    高效15法则,这本书作为时间管理的入门书籍,易读易理解,结构清晰,但是中间的某些篇幅内容过于拖沓....

  6. 【转】数据处理常用的sql语句整理

    一下语句都是基于 mysql数据库 查询是否使用索引 explain  select * FROM t_table1; 结果列的含义: table:此次查询操作是关联哪张数据表 type:连接查询操作 ...

  7. MyBatis探究-----传递参数详解

    1.单个参数 mybatis不会做特殊处理,#{参数名/任意名}:取出参数值 例如:接口中方法 public Employee getEmpById(String empId); XML中 <s ...

  8. nginx ../logs/nginx.pid" failed (2: No such file or directory)

    [1]nginx.pid相关 (1)可能出现两种场景: 1.1 nginx.pid文件不存在 发生现象:nginx: [error] open() "/usr/local/lib/ubcsr ...

  9. Python中__init__()和self的有啥用

    这篇博客让我一下子就理解了,https://www.cnblogs.com/illusion1010/p/9527034.html,感谢博主 由于类可以起到模板的作用,因此,可以在创建实例的时候,把一 ...

  10. Hunspell介绍及试用

    1.简介 Hunspell是一个为拥有多态和复杂组合词的语言所设计的拼写检查器,原本为匈牙利语设计. Hunspell是一个自由软件,在GPL.LGPL和MPL三许可证下发行. Hunspell对主要 ...