一、工厂方法模式分类(3 种)

  1. 普通工厂模式
  2. 多个工厂方法模式
  3. 静态工厂方法模式

二、工厂方法模式详解

(1)普通工厂模式

普通工厂模式就是建立一个工厂类,对实现了同一接口的一些进行实例的创建。

这里写图片描述

// 1、创建不同产品的共同接口
public interface Sender {
  /**
   * 邮寄接口中有一个邮寄方法待实现
   */
  public void Send();
}
/**
 * 2、(实现类)邮件邮寄类实现了邮寄接口,实现其邮寄的抽象方法
 * @author barnett
 */
public class MailSender implements Sender {

  @Override
  public void Send() {
    System.out.println("I am MailSender!");
  }
}
/**
 * 短信邮寄类实现了邮寄接口,实现其邮寄的抽象方法
 * @author barnett
 *
 */
public class SmsSender implements Sender {

  @Override
  public void Send() {
    System.out.println("I am SmsSender!");
  }
}
/**
 * 3、工厂类,负责多次制造产品(new出复用的类)
 * @author barnett
 */
public class SendFactory {

  /**
   * 工厂类中的生产方法
   * @param type	输入要生产的产品类型
   * @return	返回一个产品
   */
  public Sender produce(String type) {
    if("mail".equals(type)) {
      return new MailSender();
    } else if("sms".equals(type)) {
      return new SmsSender();
    } else {
      System.out.println("请输入正确的类型!");
      return null;
    }
  }
}
/**
 * 4、测试类,实例一个工厂,生产多个产品
 * @author barnett
 *
 */
public class FactoryTest {

  public static void main(String[] args) {
    // 创建一个工厂(可多次生产)
    SendFactory factory = new SendFactory();
    // 使用工厂按照要求生产相应产品
    Sender sender = factory.produce("sms");
    // 调用产品的方法
    sender.Send();
    Sender sender2 = factory.produce("mail");
    sender2.Send();
  }
}

工厂优势

1、 实例出一个工厂,再生产工厂内可以生产的产品,则只需要调用工厂的生产方法,通过传入不同的参数,生产不同的产品 2、传统方式则每次要生产一个产品时都需要实例化,然后调用生产方法 3、这样一来,要生产产品时,无需了解内部细节,交由工厂管理,节省资源

(2)多个工厂方法模式

多个工厂方法模式,是对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象

而多个工厂方法模式是提供多个工厂方法,分别创建对象。

这里写图片描述

/**
 * 工厂类,负责多次制造产品
 * @author barnett
 *
 */
public class MultiMethodSendFactory {

  /**
   * 专门生产邮件邮寄器的方法
   * @return
   */
  public Sender produceMail() {
    return new MailSender();
  }

  /**
   * 专门生产短信邮寄器的方法
   * @return
   */
  public Sender produceSms() {
    return new SmsSender();
  }
}
/**
 * 测试类,实例一个工厂,生产多个产品
 * @author barnett
 *
 */
public class MultiMethodFactoryTest {

  public static void main(String[] args) {
    // 创建一个工厂(可多次生产)
    MultiMethodSendFactory factory = new MultiMethodSendFactory();
    // 根据不同的需求调用不同的方法
    Sender mailSender = factory.produceMail();
    mailSender.Send();
    Sender smsSender = factory.produceSms();
    smsSender.Send();
  }
}

(3)静态工厂方法模式

将上面的多个工厂方法模式里的方法置为静态的,不需要创建实例直接调用即可。

/**
 * 工厂类,负责多次制造产品
 * @author barnett
 */
public class StaticMethodSendFactory {

  /**
   * 专门生产邮件邮寄器的方法
   * @return
   */
  public static Sender produceMail() {
    return new MailSender();
  }

  /**
   * 专门生产短信邮寄器的方法
   * @return
   */
  public static Sender produceSms() {
    return new SmsSender();
  }
}
/**
 * 测试类,直接调用工厂中的静态方法,生产产品
 * @author barnett
 */
public class StaticMethodFactoryTest {

  public static void main(String[] args) {
    Sender mailSender = StaticMethodSendFactory.produceMail();
    mailSender.Send();
    Sender smsSender = StaticMethodSendFactory.produceSms();
    smsSender.Send();
  }
}