抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。
抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象。他与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则是针对的多个产品等级结构。在编程中,通常一个产品结构,表现为一个接口或者抽象类,也就是说,工厂方法模式提供的所有产品都是衍生自同一个接口或抽象类,而抽象工厂模式所提供的产品则是衍生自不同的接口或抽象类。
下面以一个媒体工厂类为例子,同时用到了工厂方法模式和抽象工厂模式,希望在两者的对比之下,知道其中的差别。工厂方法模式针对媒体(音频和视频)的共有功能play和pause,分出MusicPlayer和VideoPlayer。抽象工厂模式则是衍生出Windows和Mac的媒体接口。
1、创建音频播放器和视频播放器的共同接口,并各自实现。
/**
* 创建一个媒体接口,定义了播放和暂停两个方法
*/
public interface Media
{
public void play();
public void pause();
}
/**
* 音频播放器
*/
public class MusicMedia implements Media
{
@Override
public void play()
{
System.out.println("MusicPlayer is playing...");
}
@Override
public void pause()
{
// TODO Auto-generated method stub
}
}
/**
* 视频播放器
*/
public class VideoPlayer implements Media
{
@Override
public void play()
{
System.out.println("VideoPlayer is playing...");
}
@Override
public void pause()
{
// TODO Auto-generated method stub
}
}
2、创建抽象工厂接口,提供Windows和Mac的媒体工厂接口。
public interface MediaFactory
{
public MusicMedia createMusicPlayer();
public VideoPlayer createVideoPlayer();
}
/**
* Windows下的媒体工厂类
*/
public class WinFactory implements MediaFactory
{
@Override
public MusicMedia createMusicPlayer()
{
System.out.print("Windows:");
return new MusicMedia();
}
@Override
public VideoPlayer createVideoPlayer()
{
return new VideoPlayer();
}
}
/**
* Mac下的媒体工厂类
*/
public class MacFactory implements MediaFactory
{
@Override
public MusicMedia createMusicPlayer()
{
System.out.print("Mac:");
return new MusicMedia();
}
@Override
public VideoPlayer createVideoPlayer()
{
return new VideoPlayer();
}
}
每一个模式都是针对一定问题的解决方案,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式针对的是多个产品等级结构。从上面的例子,工厂方法模式在一个工厂接口实现不同的方法,根据需要得到音频或视频的对象(工厂方法模式提供的所有产品都是衍生自同一个接口或抽象类);抽象工厂模式通过不同的工厂接口实现了在不同平台上进行视频和音频的播放和暂停(抽象工厂模式所提供的产品则是衍生自不同的接口或抽象类)。
参考:http://blog.youkuaiyun.com/zhengzhb/article/details/7359385