分析以下代码是否使用了工厂方法模式public class AudioFilter extends FileFilter { public boolean accept(File f) { String fileName = f.getName().toLowerCase(); return fileName.endsWith(".mp3") || fileName.endsWith(".ogg") || fileName.endsWith(".flac") || fileName.endsWith(".wavpack") || fileName.endsWith(".ape") || fileName.endsWith(".wav") || fileName.endsWith(".au") || fileName.endsWith(".aiff") || f.isDirectory(); } public String getDescription() { return "*.mp3,*.ogg,*.flac,*.wavpack,*.ape,*.wav,*.au,*.aiff"; } }
时间: 2024-03-30 18:34:42 浏览: 16
这段代码并没有使用工厂方法模式。它实现了Java API中的FileFilter接口,重写了其中的两个方法:accept和getDescription。其中accept方法用于判断一个文件是否符合过滤条件,而getDescription方法则返回过滤器的描述信息。虽然这个类可以被看作是一个工厂类,用于创建符合特定条件的文件过滤器,但它并没有采用工厂方法模式的实现方式。
相关问题
请用工厂方法模式获取不同类型音乐文件修改下列代码public class AudioFilter extends FileFilter { public boolean accept(File f) { String fileName = f.getName().toLowerCase(); return fileName.endsWith(".mp3") || fileName.endsWith(".ogg") || fileName.endsWith(".flac") || fileName.endsWith(".wavpack") || fileName.endsWith(".ape") || fileName.endsWith(".wav") || fileName.endsWith(".au") || fileName.endsWith(".aiff") || f.isDirectory(); } public String getDescription() { return ".mp3,.ogg,.flac,.wavpack,.ape,.wav,.au,.aiff"; } }
可以使用工厂方法模式创建不同类型音乐文件的过滤器,具体实现如下:
首先,定义一个接口 MusicFilter,用于表示不同类型音乐文件的过滤器:
```java
public interface MusicFilter {
boolean accept(File f);
String getDescription();
}
```
然后,定义一个工厂类 MusicFilterFactory,用于创建不同类型音乐文件的过滤器:
```java
public class MusicFilterFactory {
public static MusicFilter createFilter(String type) {
switch (type) {
case ".mp3":
return new MP3Filter();
case ".ogg":
return new OggFilter();
case ".flac":
return new FlacFilter();
case ".wavpack":
return new WavPackFilter();
case ".ape":
return new ApeFilter();
case ".wav":
return new WavFilter();
case ".au":
return new AuFilter();
case ".aiff":
return new AiffFilter();
default:
throw new IllegalArgumentException("Unsupported file type: " + type);
}
}
}
```
其中,MP3Filter、OggFilter、FlacFilter 等类分别实现 MusicFilter 接口,用于处理不同类型的音乐文件。
例如,MP3Filter 类的实现如下:
```java
public class MP3Filter implements MusicFilter {
@Override
public boolean accept(File f) {
String fileName = f.getName().toLowerCase();
return fileName.endsWith(".mp3") || f.isDirectory();
}
@Override
public String getDescription() {
return "*.mp3";
}
}
```
其他类型的音乐文件的过滤器的实现类似。
最后,在客户端代码中,可以使用 MusicFilterFactory 来创建不同类型的音乐文件的过滤器,例如:
```java
MusicFilter mp3Filter = MusicFilterFactory.createFilter(".mp3");
MusicFilter flacFilter = MusicFilterFactory.createFilter(".flac");
```
这样,客户端代码就可以通过工厂方法来获取不同类型的音乐文件的过滤器,而不需要知道具体的实现细节。
请用工厂方法模式修改下列代码public class AudioFilter extends FileFilter { public boolean accept(File f) { String fileName = f.getName().toLowerCase(); return fileName.endsWith(".mp3") || fileName.endsWith(".ogg") || fileName.endsWith(".flac") || fileName.endsWith(".wavpack") || fileName.endsWith(".ape") || fileName.endsWith(".wav") || fileName.endsWith(".au") || fileName.endsWith(".aiff") || f.isDirectory(); } public String getDescription() { return "*.mp3,*.ogg,*.flac,*.wavpack,*.ape,*.wav,*.au,*.aiff"; } }
使用工厂方法模式可以将创建对象的逻辑从客户端代码中分离出来,使得客户端代码只需要知道所需产品的接口,而不需要知道具体的产品类。在这个例子中,我们可以创建一个工厂类来创建 AudioFilter 类的实例,代码如下:
```java
public class AudioFilterFactory {
public static AudioFilter createAudioFilter() {
return new AudioFilter();
}
}
```
然后,在客户端代码中,我们可以使用工厂方法来创建 AudioFilter 的实例,如下所示:
```java
AudioFilter filter = AudioFilterFactory.createAudioFilter();
```
这样,客户端代码就不需要知道 AudioFilter 的具体实现细节,只需要通过工厂方法来获取对象即可。