• 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
    谷歌浏览器关闭页面
    复制代码

     总结:

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

    代码拷来总觉浅,绝知此事要躬行
  • 相关阅读:
    初涉Django与MySQL连接
    Mysql数据库操作常用命令
    解决远程登录MYSQL数据库
    全集网影片下载
    LR学习资料
    LR性能测试说明
    fiddler
    Axure(快速原型设计工具)
    httpwatch
    Appscan(安全性测试工具)
  • 原文地址:https://www.cnblogs.com/mark5/p/11753090.html
Copyright © 2020-2023  润新知