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();
}
}