设计模式工厂模式(Factory Pattern)
Posted nicojerry
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式工厂模式(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 Method Pattern)