抽象工厂模式和工厂方法模式都是用于创建对象的设计模式。虽然它们都属于工厂模式,但它们有很大的不同点。在本文中,我们将从多个角度分析抽象工厂和工厂方法的区别。
1. 定义
工厂方法模式定义为一个接口,但让子类决定要实例化哪个类。这个模式将一个对象的创建过程推迟到其子类。抽象工厂模式定义为一个接口,但让子类决定要实例化哪个类。这个模式是工厂方法模式的扩展,为创建一系列相关或相互依赖的对象提供了接口。
2. 实现
在工厂方法模式中,我们有一个抽象工厂,它声明了一个返回实例对象的工厂方法。在抽象方法中不提供实现。这些实现是由具体的子类实现的。通过这些子类的实现,我们就可以创建与工厂模式中有关的对象。在抽象工厂模式中,我们也有一个抽象工厂,但它声明了一组返回不同抽象对象的工厂方法。
3. 侧重点
工厂方法模式侧重于“开放 - 关闭原则”,它允许您通过添加新的子类来扩展您的代码,而不是修改它。抽象工厂模式侧重于工厂的家族,即它们如何创建一系列相关的或依赖的对象。
4. 使用场景
工厂方法模式适用于需要基于不同设备类别和其他条件创建对象的情况。它可以在运行时创建对象,而不会暴露创建逻辑。抽象工厂模式适用于创建与其他对象家族相关的对象。例如,如果您需要创建一个 GUI 工具包,并且您需要确保单个窗口中使用的组件具有样式和外观的一致性,则可以使用此模式。
5. 设计比较
工厂模式更倾向于单个产品或对象的实现,而抽象工厂模式则强调产品的家族或系列。抽象工厂可以视为一个对象创建工厂,而工厂方法则视为一个方法级别上的工厂。
6. 示例
示例中把AudioPlayer作为一个产品家族,分别创建MP3和MP4两种播放器。
使用工厂模式的实现:
```
interface MediaPlayer {
void play();
}
class Mp3Player implements MediaPlayer {
public void play() {
System.out.println("播放Mp3");
}
}
class Mp4Player implements MediaPlayer {
public void play() {
System.out.println("播放Mp4");
}
}
class MediaPlayerFactory {
public MediaPlayer getMediaPlayer(String mediaType) {
if (mediaType.equals("mp3")) {
return new Mp3Player();
}
else if (mediaType.equals("mp4")) {
return new Mp4Player();
}
else {
System.out.println("媒体类型不支持");
return null;
}
}
}
```
使用抽象工厂的实现:
```
interface MediaPlayer {
void play();
}
interface MediaPlayerFactory {
MediaPlayer createMediaPlayer();
}
class Mp3Factory implements MediaPlayerFactory {
public MediaPlayer createMediaPlayer() {
return new Mp3Player();
}
}
class Mp4Factory implements MediaPlayerFactory {
public MediaPlayer createMediaPlayer() {
return new Mp4Player();
}
}
class Client {
private MediaPlayerFactory mediaPlayerFactory;
public Client(MediaPlayerFactory mediaPlayerFactory) {
this.mediaPlayerFactory = mediaPlayerFactory;
}
public void playMedia() {
MediaPlayer mediaPlayer = mediaPlayerFactory.createMediaPlayer();
mediaPlayer.play();
}
}
```
经过对比,我们可以看到,在工厂方法中,我们只针对单个产品进行实现。而在抽象工厂的示例中,我们有多个产品。这是工厂方法模式和抽象工厂模式之间的主要区别。
扫码咨询 领取资料