zoukankan      html  css  js  c++  java
  • 设计模式(二)工厂模式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();
      }

    }

  • 相关阅读:
    vue 组件传值
    ES6 解构赋值
    JS filter的使用
    FormData实现文件上传
    vue+element 表格导出Excel文件
    vue2.0 element-ui中input的@keyup.native.enter='onQuery'回车查询刷新整个表单的解决办法
    vue2.0 element-ui中el-upload的before-upload方法返回false时submit()不生效解决方法
    JavaScript正则表达式检验手机号码、邮箱、ip地址等
    Vue 2.0 pagination分页组件
    angular环境
  • 原文地址:https://www.cnblogs.com/Claire6649/p/5886659.html
Copyright © 2011-2022 走看看