Factory Method模式在一个抽象类中留下某个创建产品类的抽象方法,其它与产品操作相关联的方法都先依赖于产品所依赖的公共接口,而不是依赖于产品的实现。
当您的成品中有一个或多个产品无法确定时,您先确定这些产品的操作接口,然后用产品的抽象操作接口先完成其它的工作,产品的实现则推迟至实现产品接口的子类完成,一旦产品加入,即可完成您的成品。
假设您要完成一个文件编辑器,您希望这个编辑器可以适用于所有类型的档案编辑,例如RTF、DOC、TXT等等,尽管这些文件有着不同的格式,您先确定的是这些文件必须具备的一些操作接口,例如储存、开启、关闭等等,您用一个IDocument接口来进行操作,这么一来这个框架就无需考虑实际的储存、开启等细节是如何进行的。
文件编辑器UML 类图
//-- 产品类的公共接口 public interface IDocument { public void open(); public void save(); public void close(); }
public abstract class AbstractEditor { //-- 产品的公共接口 private IDocument document; //-- 抽象的工厂方法 public abstract IDocument createDocument(); //-- 先用产品的公共接口先完成其它的工作,如储存、开启等 public void newDocument() { document = createDocument(); document.open(); } public void saveDocument() { if(document != null) document.save(); } public void closeDocument() { if(document != null) document.close(); } }
//-- RTF产品类,实现了公共接口IDocument public class RTFDocument implements IDocument { public RTFDocument() { System.out.println("建立RTF文件"); } public void open() { System.out.println("开启文件"); } public void save() { System.out.println("储存文件"); } public void close() { System.out.println("关闭文件"); } }
public class RTFEditor extends AbstractEditor { //-- 针对RTF产品的工厂方法 public IDocument createDocument() { return new RTFDocument(); } }
//-- 客户应用程序 public class RunClientCode { public static void main(String[] args) { AbstractEditor editor = new RTFEditor(); editor.newDocument(); editor.saveDocument(); editor.closeDocument(); } }