设计模式之工厂方法模式(Factory Method)

工厂方法模式(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...


总体来说,凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建。在以上的三种模式中,第一种如果传入的参数有误,就不能正确创建对象,第三种相对于第二种,不需要实例化工厂类。所以,大多数情况下,我们会选用第三种——静态工厂方法模式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值