工厂方法模式(Factory Method)的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。
工厂方法模式分为3种。下面以一个媒体工厂类为例子,根据需要可以实例化为音频播放器或视频播放器。
一、普通工厂方法模式。
首先,创建音频播放器和视频播放器的共同接口。
/**
* 创建一个媒体接口,定义了播放和暂停两个方法
*/
public interface Media
{
public void play();
public void pause();
}
接着,创建具体实现类。
音频播放器类:
public class MusicPlayer 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
}
}
最后,创建工厂类。
public class MediaFactory
{
public Media produce(String string)
{
if("MusicPlayer".equals(string))
return new MusicPlayer();
else if("VideoPlayer".equals(string))
return new VideoPlayer();
else
{
System.out.println("Wrong Type!");
return null;
}
}
}
测试一下。
public class Test
{
public static void main(String[] args)
{
MediaFactory factory = new MediaFactory();
Media media = factory.produce("MusicPlayer");
media.play();
}
}
结果输出:MusicPlayer is playing...
这个方法是根据工厂对象传入的参数来得到具体需要的实例,但是这个参数是不确定的,如果传入的是错误的参数,则不能得到需要的实例,下面的方法则是改进。
二、多个工厂方法模式。
对MediaFactory类进行修改。
public class MediaFactory
{
public Media produceMusicPlayer()
{
return new MusicPlayer();
}
public Media produceVideoPlayer()
{
return new VideoPlayer();
}
}
工厂类提供多个工厂方法。
测试一下。
public class Test
{
public static void main(String[] args)
{
MediaFactory factory = new MediaFactory();
Media media = factory.produceMusicPlayer();
media.play();
}
}
结果输出:MusicPlayer is playing...
三、静态工厂方法模式。
将上面的多个工厂方法模式里的方法置为静态的,不需要创建实例,直接调用即可。
public class MediaFactory
{
public static Media produceMusicPlayer()
{
return new MusicPlayer();
}
public static Media produceVideoPlayer()
{
return new VideoPlayer();
}
}
测试一下。
public class Test
{
public static void main(String[] args)
{
Media media = MediaFactory.produceMusicPlayer();
media.play();
}
}
结果输出:MusicPlayer is playing...
总体来说,凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建。在以上的三种模式中,第一种如果传入的参数有误,就不能正确创建对象,第三种相对于第二种,不需要实例化工厂类。所以,大多数情况下,我们会选用第三种——静态工厂方法模式。