设计模式(二)工厂模式Factory (创建型)

工厂模式分为三种:简单工厂模式 (Simple Factory) 、工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory)

//举例:发送邮件和短信的例子

/**
* @author Administrator
* 产品类
*/
interface Sender{
  void send();
}
class MailSender implements Sender{
  @Override
  public void send() {
    System.out.println("this is a mailsender !");

  }
}
class SmsSender implements Sender{
  @Override
  public void send() {
    System.out.println("this is a smssender !");

}
}
/**
* @author Administrator
* 工厂类
*/
class SenderFactory{
  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;
    }
  }
}
/**
* @author Administrator
* 测试类
*/
public class SimpleFactoryTest{
  public static void main(String[] args) {
    SenderFactory factory = new SenderFactory();
    Sender sender = factory.produce("mail");
    sender.send();
  }
}

//结果:

this is a mailsender !

对于简单工厂模式而言,如果传递的字符串出错,则不能正确创建对象,或者说如果要发送彩信,需要去改进SenderFactory方法,显然违背了设计的原则
这里多个共产方法模式是提供了多个工厂方法,分别创建对象

/**
* @author Administrator
* 工厂类
*/
//class SenderFactory2{
// //发短信
//   public Sender smsProduce(){
//      return new SmsSender();
//   }
// //发邮件
//   public Sender mailProduce(){
//      return new MailSender();
//   }
//}
//也可以将工厂方法类改为静态的,这样就可以不同通过创建工厂的实例去调用
class SenderFactory2{
//发短信
  public static Sender smsProduce(){
    return new SmsSender();
  }
//发邮件
  public static Sender mailProduce(){
    return new MailSender();
  }
}

/**
* @author Administrator
* 测试类
*/
public class FactoryMethodTest {

  public static void main(String[] args) {
//     SenderFactory2 factory2= new SenderFactory2();
//      factory2.smsProduce().send();
//     factory2.mailProduce().send();

    //静态工厂方法模式
    SenderFactory2.smsProduce().send();
    SenderFactory2.mailProduce().send();
  }

}

/**
* @author Administrator
* 工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是,如果想要扩展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题。
* 解决:用抽象工厂模式,创建多个工厂,这样一旦需要增加新功能,直接增加新的工厂类就可以了,不需要修改之前的代码。
*
* 抽象工厂模式的好处就是,如果你现在想增加一个功能:发及时信息,则只需要做一个实现类,实现Sender接口,同时做一个工厂类,实现Factory接口,就OK了,无需改现成的代码。这样做,扩展性好。
*/

//工厂类,多个工厂类
interface Factory{
  Sender produce();
}
class SmsFactory implements Factory{
  @Override
  public Sender produce() {
    return new SmsSender();
  }
}
class MailFactory implements Factory{
  @Override
  public Sender produce() {
    return new MailSender();
  }
}

/**
* @author Administrator
* 测试类
*/
public class AbstractFactoryTest {

  public static void main(String[] args) {
    Factory factory = new SmsFactory();
    Sender sender = factory.produce();
    sender.send();
  }

}

原文地址:https://www.cnblogs.com/Claire6649/p/5886659.html