【设计模式】工厂模式(Factory Pattern)
【前言】
很多时候我们编写了好几个接口的实现类,这些实现类分别有不同特性,用在不同的情景下。而我们对于这些实现类,也往往不会对外暴露内部增加的方法,只希望外部调用接口的方法,在这种情况下,我们没必要让调用者知道实现类,只需要提供一个方法让调用者使用从而创建具有不同特性的接口实例。而这个方法我们通常写在一个叫工厂类的类里面,从而对应这个接口,这样调用者可以根据自身需要选择具有不同特性的接口实例,又避免了实现类和外部调用者耦合的问题。
【特点】
工厂模式属于创建型的设计模式(用于创建对象),由工厂对象提供方法创建接口的实例。
在工厂模式中,创建对象时不会对外暴露创建逻辑,即外部不知道创建出来的实际类型是什么。
一个接口对应一个工厂类(一个接口伴随一个工厂类),可以归纳为一对一关系。
【适用】
只提供接口实例给外部使用,而且外部只能使用接口的方法,否则工厂模式不适合。
对外提供的接口有两个以上的不同实现方式(运行特性不同),否则工厂模式不合适。
【例子】
有一个需求,需要向外部提供一个日志打印器,根据不同情况,可以在服务器打印,本地打印,控制台打印日志。
这里我们先定义一个接口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)的更多相关文章
- 设计模式 - 工厂模式(factory pattern) 具体解释
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u012515223/article/details/27081511 工厂模式(factory pa ...
- 23种设计模式--工厂模式-Factory Pattern
一.工厂模式的介绍 工厂模式让我们相到的就是工厂,那么生活中的工厂是生产产品的,在代码中的工厂是生产实例的,在直白一点就是生产实例的类,代码中我们常用new关键字,那么这个new出来的实例 ...
- 设计模式 - 出厂模式(factory pattern) 详细说明
出厂模式(factory pattern) 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/details/27081511 工厂方法模式 ...
- python 设计模式之工厂模式 Factory Pattern (简单工厂模式,工厂方法模式,抽象工厂模式)
十一回了趟老家,十一前工作一大堆忙成了狗,十一回来后又积累了一大堆又 忙成了狗,今天刚好抽了一点空开始写工厂方法模式 我看了<Head First 设计模式>P109--P133 这25页 ...
- 【设计模式】工厂模式 Factory Pattern
1)简单工厂(不是模式) 简单工厂只是一种变成习惯,并非23种设计模式之一. 简单工厂提供将实例话那种类型留给运行时判断,而非编译时指定.简单工厂模式就是由一个工厂类根据传入的参数决定创建出哪一个类的 ...
- JAVA设计模式之工厂模式—Factory Pattern
1.工厂模式简介 工厂模式用于对象的创建,使得客户从具体的产品对象中被解耦. 2.工厂模式分类 这里以制造coffee的例子开始工厂模式设计之旅. 我们知道coffee只是一种泛举,在点购咖啡时需要指 ...
- 创建型模式篇(工厂模式Factory Pattern)
一.工厂模式(Factory Pattern) 1.定义: 在软件系统,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口.提供一种封 ...
- [设计模式]工厂模式factory
参考:http://wxg6203.iteye.com/blog/740229 简单工厂模式(simple factory)是类的创建模式,又叫静态工厂方法(static factory method ...
- 大话设计模式--工厂模式 factory -- C++实现实例
实现<大话设计模式>的C++版本... 1. 工厂模式 使用的范围是 同一个基类,下面很多子类. (1)这里很容易出现的一个问题n多的子类继承自抽象基类,我们不得不在每次要用到子类的地方就 ...
- 设计模式--工厂模式Factory(创建型)
工厂模式属于创建型模式,分为三类,简单工厂模式.工厂方法模式.抽象工厂模式. 一.简单工厂模式 在工厂中做判断,根据产品类型从而创造相应的产品,当增加新产品时需要修改工厂类. 例如: enum CTY ...
随机推荐
- MySQL保留字 ERROR 1064 (42000)
在MySQL(5.7.18)数据库中建表 CREATE TABLE SA_ACT_ITEM ( ITEMID ) NOT NULL, REGION ), ACTIONID ), ITEMNAME ), ...
- XML CDATA识别“<,>”
http://www.w3school.com.cn/xml/xml_cdata.asp 术语 CDATA 指的是不应由 XML 解析器进行解析的文本数据(Unparsed Character Dat ...
- 帮助Bsny(乱搞做法)
帮助Bsny 题目描述 Bsny的书架乱成一团了,帮他一下吧! 他的书架上一共有n本书,我们定义混乱值是连续相同高度书本的段数.例如,如果书的高度是30,30,31,31,32,那么混乱值为3:30, ...
- node获取当前路径的三种方法
node提供了3种获取路径的方法 ,在当前目录下,运行node const {resolve} = require('path') console.log('__dirname : ' + __di ...
- 利用BLEU进行机器翻译检测(Python-NLTK-BLEU评分方法)
双语评估替换分数(简称BLEU)是一种对生成语句进行评估的指标.完美匹配的得分为1.0,而完全不匹配则得分为0.0.这种评分标准是为了评估自动机器翻译系统的预测结果而开发的,具备了以下一些优点: 计算 ...
- php 当前日期加一天和指定日期加一天
1.给当前时间加一天?一小时? <?phpecho "今天:",date('Y-m-d H:i:s'),"<br>";echo "明 ...
- John Deere Service Advisor with Nexiq clone 90% Worked
FYI, John Deere Service Advisor 90% works with Nexiq China clone. Topic 1: John deere SA possible wi ...
- 操作mongodb
MongoDB数据库是以k-v形式存储在磁盘上的. import pymongoclient = pymongo.MongoClient(host='10.29.3.40',port=27017)db ...
- 虚拟蜜罐honeyd安装使用
转https://blog.csdn.net/jack237/article/details/6828771
- lnmp一键安装包安装失败,或者安装下载缓慢的解决办法
使用阿里云内网安装模块 阿里云外网: ftp://soft6.vpser.net/ 阿里云云内网:ftp://10.163.196.147 修改lnmp.conf 文件 目前可用的国内LNMP ful ...