OOP - 创造模式(工厂方法)我在正确的道路上吗?

时间:2013-11-17 20:34:13

标签: java oop design-patterns

我正在学习设计模式,在这个阶段,我正在玩创作模式,精确的工厂方法。

我们的想法是使用工厂方法在“虚拟”文件系统中创建文档或链接(符号链接)。

有人愿意看一下代码并给我建议并指导我走正确的道路吗?

FileFactory.java

  public final class FileFactory {

public FileFactory(){}
public static IFileFactory createSoftLink(){
    return new SymbolicLinkFactory();
}
public static IFileFactory createDocument(){
    return new DocumentFileFactory();
}

接口IFileFactory.java

public interface IFileFactory {
FileSystemElement createFile (String name, String mimeType, String currentDirectory, String user) throws IOException;}

DocumentFileFactory.java

public class DocumentFileFactory implements IFileFactory {

protected DocumentFileFactory() {}

@Override
public mFile createFile (String name, String mimeType, String currentDirectory, String user) throws IOException {
    String fName = name;
    if (mimeType.equalsIgnoreCase("docx")) {
        fName += ".docx";
    }else if (mimeType.equalsIgnoreCase("pptx")) {
        fName += ".pptx";
    }else if (mimeType.equalsIgnoreCase("xlsx")) {
        fName += ".xlsx";
    }else if (mimeType.equalsIgnoreCase("docm")) {
        fName += ".docm";
    }else if (mimeType.equalsIgnoreCase("pptm")) {
        fName += ".pptm";
    }else if (mimeType.equalsIgnoreCase("xlxm")) {
        fName += ".xlxm";
    }else {
        fName += "."+mimeType;
    }

    mFile file = new mFile();
    file.rename(fName);
    file.create(fName, currentDirectory, user);
    Path filePath = Paths.get(currentDirectory+System.getProperty("file.separator")+fName);
    file.setPath(filePath);
    return file;
}

SymbolicLinkFactory.java

public class SymbolicLinkFactory implements IFileFactory {
private FileSystemElement fsElement;

protected SymbolicLinkFactory() {}

@Override
public FileSystemElement createFile(String name, String mimeType, String currentDirectory, String user) throws IOException {
    SoftLink sl = new SoftLink(name, fsElement, fsElement.getPath(), Paths.get(currentDirectory));
    return sl;
}

public void setFileSystemElement(FileSystemElement fsElement) {
    this.fsElement = fsElement;
}

1 个答案:

答案 0 :(得分:0)

总的来说,它看起来很好。如果你有一些逻辑显示你为什么要使用工厂模式会更好,例如检查你想要创建的文档是否已经存在,并返回一个软链接创建者。

正如Josh所说,createFile的实现有点令人困惑,并将注意力转移到你的问题/目标上。

如代码所示,不需要FileFactory类。它所做的就是集中/快捷地实现IFileFactory接口的实现。

工厂类还有两个可能与您的情况相关的常见用例:

  1. 依赖注入:隐藏实际使用的实现 在FileFactory类中,允许切换实现 启动/运行时
  2. 工厂/班级家庭:这里你只是在创造 一个例子。想象一下,你有两种物品 - 文件 项目和文件夹。在这种情况下,一个"文件项"您 create与您的"文件夹"属于同一类型,例如文件 系统文件进入文件系统文件夹,Wiki页面进入 Wiki URL。