不少时候咱们编写了好几个接口的实现类,这些实现类分别有不一样特性,用在不一样的情景下。而咱们对于这些实现类,也每每不会对外暴露内部增长的方法,只但愿外部调用接口的方法,在这种状况下,咱们不必让调用者知道实现类,只须要提供一个方法让调用者使用从而建立具备不一样特性的接口实例。而这个方法咱们一般写在一个叫工厂类的类里面,从而对应这个接口,这样调用者能够根据自身须要选择具备不一样特性的接口实例,又避免了实现类和外部调用者耦合的问题。设计模式
工厂模式属于建立型的设计模式(用于建立对象),由工厂对象提供方法建立接口的实例。服务器
在工厂模式中,建立对象时不会对外暴露建立逻辑,即外部不知道建立出来的实际类型是什么。url
一个子接口对应一个工厂类(一个接口伴随一个工厂类),能够概括为一对一关系。spa
只提供接口实例给外部使用,并且外部只能使用接口的方法,不然工厂模式不适合。设计
有一个需求,须要向外部提供一个日志打印器,根据不一样状况,能够在服务器打印,本地打印,控制台打印日志。日志
这里咱们先定义一个接口Logger:code
public interface Logger{ public void log(String text); }
根据上面所说的,也有一个工厂类对应:server
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上传图片返回图片路径。对象
这个时候就很合适使用工厂模式来适应这种业务变动,首先定义一个图片上传接口,经过工厂类得到不一样的图片上传对象。这样若是之后图片上传业务再次变动,那么只须要在工厂类内部增长建立新实例的逻辑,外部只须要修改建立实例的方法的传入参数。blog
代码场景:
// 原来代码 PicInterface pic = PicFacetory.getPic("OriginServer"); // 新代码 PicInterface pic = PicFacetory.getPic("ThirdPartSDK"); // 上传,upload方法是实现接口的方法 String url = pic.upload(fileObj);