一、工厂方法模式缺陷

工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须修改工厂类,这违背了设计模式六大原则第一条闭包原则

所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。

这里写图片描述

二、抽象工厂模式实现

/**
 * 1、邮寄接口,有一个抽象邮寄方法待实现
 * @author barnett
 *
 */
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、提供器接口,返回邮寄对象,其生产方法待实现
 * 工厂依靠实现该接口,生产产品(Sender)
 * @author barnett
 *
 */
public interface Provider {

  public Sender produce();

}
/**
 * 4、工厂,邮件邮寄工厂,负责专门生产邮件邮寄实例
 * @author barnett
 *
 */
public class SendMailFactory implements Provider {

  @Override
  public Sender produce() {
    return new MailSender();
  }
}
/**
 * 短信邮寄工厂,专门生产短信邮寄实例
 * @author barnett
 *
 */
public class SendSmsFactory implements Provider {

  @Override
  public Sender produce() {
    return new SmsSender();
  }
}
/**
 * 5、测试类
 * @author barnett
 *
 */
public class Test {

  public static void main(String[] args) {
    // 实例一个邮件工厂(因其实现了提供器接口,可返回一个具有专门生产某种产品生产方法的实例)
    Provider provider = new SendMailFactory();
    // 通过该实例生产产品
    Sender sender = provider.produce();
    // 调用产品的方法
    sender.send();
    // 实例生产另一种产品的工厂
    SendSmsFactory factory = new SendSmsFactory();
    Sender sender2 = factory.produce();
    sender2.send();
  }
}

三、抽象工厂模式优势

若想生产新的产品,只需一个实现类,实现 Sender 接口,再创建一个专门用于生产该产品的工厂类,实现 Provider 接口,这样一来,无需改动原有代码,拓展性好