java设计模式--简单工厂模式

夙愿已清 提交于 2019-12-02 15:58:50

简单工厂设计模式

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

核心知识点如下:

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

 总结:

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

代码拷来总觉浅,绝知此事要躬行

简单工厂设计模式

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

核心知识点如下:

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

 总结:

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!