乐趣区

关于设计模式:设计模式简单工厂模式

1、实用场景

  • 工厂类负责创立的对象比拟少
  • 应用层只晓得传入工厂类的参数 对于如何创建对象 创立谁的对象并不关怀

    2、长处

    只需传入正确的参数 即可由工厂给咱们创立对应的实例 无需理解创立的细节

    3、毛病

    减少新产品的时候 须要批改代码 违反了开闭准则

    4、Coding 演示

    4.1 版本一

    UML 类图预览:

    1. 抽象类 video

    public abstract class Video {
      /** 创立学习视频 */
      public  abstract  void produce();}

    2.JavaVideo 继承抽象类 并实现形象办法

    public class JavaVideo extends Video{
      @Override
      public void produce() {System.out.println("录制 java 学习视频中");
      }
    }

    3.PythonVideo 继承抽象类 并实现形象办法

    public class PythonVideo extends Video{
      @Override
      public void produce() {System.out.println("录制 python 学习视频");
      }
    }

    4. 简略工厂类

    public class VideoFactory {public Video getVideo(String videoType){if("java".equalsIgnoreCase(videoType))
              return new JavaVideo();
          else if("python".equalsIgnoreCase(videoType))
              return new PythonVideo();
          return null;
      }
    }

    5. 测试类

    public class Test {public static void main(String[] args) {VideoFactory videoFactory = new VideoFactory();
          Video java = videoFactory.getVideo("java");
          java.produce();
          Video python = videoFactory.getVideo("python");
          python.produce();}
    }

    输入后果:

    上述的代码构造中咱们应用一个 Factory 类,用来帮忙咱们生产对应的实例,咱们须要传入正确的参数,Factory 能够帮忙咱们创立对应的实例。这就如同咱们去咖啡厅喝咖啡,咱们只需对 watier 说:” 我要一杯拿铁 ”, 服务员就会主动上拿铁,而不须要咱们关怀制作拿铁的步骤。

    4.2 版本 2

    咱们发现在代码中把对应的参数写死并不合乎代码的标准,也不不便保护。所以咱们思考应用反射对代码进行一下重构。

    public class VideoFactory {public Video getVideo(Class c){
          Video video = null;
          try {
              // Class.forName 加载指定的类 
              video =   (Video)Class.forName((c.getName())).newInstance();} catch (InstantiationException e) {e.printStackTrace();
          } catch (IllegalAccessException e) {e.printStackTrace();
          } catch (ClassNotFoundException e) {e.printStackTrace();
          }
          return video;
      }
    }

    咱们应用反射,依据传入的 Class 运行时类主动创立实例,不仅实现了同样的性能,也晋升了代码的品质。

    5、扩大

    简略工厂模式在源码中的体现

    5.1 Calendar.class


    类图:




    下面的这种应用办法 咱们也常常在开发中应用到

5.2 在 jdbc 中应用

回顾一下获取 jdbc 连贯的三步?


public class MySqlConnectionTest {public static void getConnection() {
        Connection conn = null;
        try {
             // 注册数据库驱动
            Class.forName("com.mysql.jdbc.Driver"); 
             // 数据库的地址
            String url = "jdbc:mysql://localhost:3306/briup";
             // 获取连贯数据库的 Connection 对象
            conn = DriverManager.getConnection(url, "root","root");
            System.out.println("数据库连贯胜利!" + conn);
        } catch (Exception e) {e.printStackTrace();
        }
    }
 
    public static void main(String[] args) {getConnection();
    }

上述代码中咱们应用类名通过反射将数据库的驱动加载进来,而后通过 DriverManager 获取对应的连贯。对 mysql,orcal 都是这样的步骤,因而咱们来探索一下 DriverManager 获取连贯的办法

上述代码中通过遍历 registeredDrivers 获取对应的注册驱动。那么他是如何获取的呢?

也就是说一旦这个驱动就像驱动治理 DriverManager 注册了咱们的驱动。而咱们是通过反射指定类名加载 mysql 的驱动,因而也就会获取 mysql 对应的链接

退出移动版