zoukankan      html  css  js  c++  java
  • java设计模式简单工厂模式

     简单工厂设计模式

    工厂模式就是专门负责将大量有共同接口的类实例化,而且不必事先知道每次是要实例化哪一个类的模式。它定义一个用于创建对象的接口,由子类决定实例化哪一个类。

    核心知识点如下:

    (1) 大量共同定义的接口。

    (2) 由不同的对象去实现该接口。

    (3) 子类(具体工厂类)决定实例化哪一个类(具体产品类)有着“一对一”的关系。

    前言(也算是工厂的一个应用需求场景吧)

    最近在构建自动化测试平台,公司需求是:必须在IE,火狐,Google浏览器下回归测试用例。Selenium的webdriver支持以上浏览器。在返回浏览器WebDriver对象时,刚好和工厂模式设计契合。于是又回顾了一下工厂模式,留下笔记分享给工厂模式学习者和自动化测试平台的构建者,理解不足之处请各位大神不吝赐教。

    1,定义WebDriver(这里是为了说明工厂模式,简单的模拟Selenium的webdriver,Selenium的Jar中有此类)

    package factory;
    
    /**
     * 简单的模拟 WebDriver的几个功能来说明工厂模式问题
     * Selenium的Jar中有此类,且方法远远多于此
     * @author Administrator
     *
     */
    public interface WebDriver {
        
      //打开页面
      public void openURL(String prmUrl);
      
      //查找元素
      public String findElement(String prmFindTyp);
      
      //关闭页面
      public void closePage();
      
    }

    2,模拟FirefoxDriver

    package factory;
    
    public class FirefoxDriver implements WebDriver {
    
        @Override
        public void openURL(String prmUrl) {
            System.out.println("火狐浏览器打开URL:" + prmUrl);
    
        }
    
        @Override
        public String findElement(String prmFindTyp) {
            System.out.println("火狐浏览器定位元素方式:" + prmFindTyp);
            return "画面元素值为:FirefoxDriver";
        }
    
        @Override
        public void closePage() {
            System.out.println("火狐浏览器关闭页面");
    
        }
    }

    3,模拟InternetExplorerDriver

    package factory;
    
    public class InternetExplorerDriver implements WebDriver {
    
        @Override
        public void openURL(String prmUrl) {
            System.out.println("IE浏览器打开URL:" + prmUrl);
    
        }
    
        @Override
        public String findElement(String prmFindTyp) {
            System.out.println("IE浏览器定位元素方式:" + prmFindTyp);
            return "画面元素值为:IEDriver";
        }
    
        @Override
        public void closePage() {
            System.out.println("IE浏览器关闭页面");
    
        }
    
    }

    4,模拟ChromeDriver

    package factory;
    
    public class ChromeDriver implements WebDriver {
    
        @Override
        public void openURL(String prmUrl) {
            System.out.println("谷歌浏览器打开URL:" + prmUrl);
    
        }
    
        @Override
        public String findElement(String prmFindTyp) {
            System.out.println("谷歌浏览器定位元素方式:" + prmFindTyp);
            return "画面元素值为:ChromeDriver";
        }
    
        @Override
        public void closePage() {
            System.out.println("谷歌浏览器关闭页面");
    
        }
    
    }

    5,WebDriver实例工厂

    package factory;
    
    public class WebDriverFacory {
        
        public static WebDriver getBrowserInstance(String browserType){
            
            switch (browserType) {
            case "IE":
                return new InternetExplorerDriver();
            case "FireFox":
                return new FirefoxDriver();
            case "Google":
                return new ChromeDriver();
            default:
                return new ChromeDriver();
            }
        }
        public static WebDriver getBrowserInstance(){
            return getBrowserInstance("Google");
        }
    
    }

    6,测试代码

    package factory;
    
    import org.junit.Test;
    
    public class WebDriverFacoryTest {
    
        @Test
        public void testIEDriver() {
            WebDriver ied =  WebDriverFacory.getBrowserInstance("IE");
            ied.openURL("www.baidu.com");
            ied.findElement("Xpath://div/a");
            ied.closePage();
        }
        @Test
        public void testFirefoxDriver() {
            WebDriver ied =  WebDriverFacory.getBrowserInstance("FireFox");
            ied.openURL("www.baidu.com");
            ied.findElement("Xpath://div/a");
            ied.closePage();
        }
        @Test
        public void testChromeDriver() {
            WebDriver ied =  WebDriverFacory.getBrowserInstance("Google");
            ied.openURL("www.baidu.com");
            ied.findElement("Xpath://div/a");
            ied.closePage();
        }
        @Test
        public void testDefaultDriver() {
            WebDriver ied =  WebDriverFacory.getBrowserInstance();
            ied.openURL("www.baidu.com");
            ied.findElement("Xpath://div/a");
            ied.closePage();
        }
    }

    7,执行结果

    IE浏览器打开URL:www.baidu.com
    IE浏览器定位元素方式:Xpath://div/a
    IE浏览器关闭页面
    谷歌浏览器打开URL:www.baidu.com
    谷歌浏览器定位元素方式:Xpath://div/a
    谷歌浏览器关闭页面
    火狐浏览器打开URL:www.baidu.com
    火狐浏览器定位元素方式:Xpath://div/a
    火狐浏览器关闭页面
    谷歌浏览器打开URL:www.baidu.com
    谷歌浏览器定位元素方式:Xpath://div/a
    谷歌浏览器关闭页面

     总结:

        工厂类负责创建的对象比较少;
        客户只知道传入工厂类的参数(如上例子传参浏览器类型),对于如何创建对象(逻辑)不关心;
        由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情况下应用。

    代码拷来总觉浅,绝知此事要躬行
  • 相关阅读:
    Java虚拟机一
    java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException
    Java虚拟机
    topcoder srm 663 div1
    topcoder srm 694 div1 -3
    topcoder srm 695 div1 -3
    topcoder srm 696 div1 -3
    topcoder srm 697 div1 -3
    topcoder srm 661 div1
    topcoder srm 698 div1 -3
  • 原文地址:https://www.cnblogs.com/yinxiaoqiexuxing/p/5609034.html
Copyright © 2011-2022 走看看