http://www.cnblogs.com/yinxiaoqiexuxing/p/5609034.html
简单工厂设计模式
工厂模式就是专门负责将大量有共同接口的类实例化,而且不必事先知道每次是要实例化哪一个类的模式。它定义一个用于创建对象的接口,由子类决定实例化哪一个类。
核心知识点如下:
(1) 大量共同定义的接口。
(2) 由不同的对象去实现该接口。
(3) 子类(具体工厂类)决定实例化哪一个类(具体产品类)有着“一对一”的关系。
前言(也算是工厂的一个应用需求场景吧)
最近在构建自动化测试平台,公司需求是:必须在IE,火狐,Google浏览器下回归测试用例。Selenium的webdriver支持以上浏览器。在返回浏览器WebDriver对象时,刚好和工厂模式设计契合。于是又回顾了一下工厂模式,留下笔记分享给工厂模式学习者和自动化测试平台的构建者,理解不足之处请各位大神不吝赐教。
1,定义WebDriver(这里是为了说明工厂模式,简单的模拟Selenium的webdriver,Selenium的Jar中有此类)
packagefactory;/*** 简单的模拟 WebDriver的几个功能来说明工厂模式问题
* Selenium的Jar中有此类,且方法远远多于此
*@authorAdministrator
**/publicinterfaceWebDriver {//打开页面publicvoidopenURL(String prmUrl);//查找元素publicString findElement(String prmFindTyp);//关闭页面publicvoidclosePage();
}
2,模拟FirefoxDriver
packagefactory;publicclassFirefoxDriverimplementsWebDriver {
@OverridepublicvoidopenURL(String prmUrl) {
System.out.println("火狐浏览器打开URL:" +prmUrl);
}
@OverridepublicString findElement(String prmFindTyp) {
System.out.println("火狐浏览器定位元素方式:" +prmFindTyp);return"画面元素值为:FirefoxDriver";
}
@OverridepublicvoidclosePage() {
System.out.println("火狐浏览器关闭页面");
}
}
3,模拟InternetExplorerDriver
packagefactory;publicclassInternetExplorerDriverimplementsWebDriver {
@OverridepublicvoidopenURL(String prmUrl) {
System.out.println("IE浏览器打开URL:" +prmUrl);
}
@OverridepublicString findElement(String prmFindTyp) {
System.out.println("IE浏览器定位元素方式:" +prmFindTyp);return"画面元素值为:IEDriver";
}
@OverridepublicvoidclosePage() {
System.out.println("IE浏览器关闭页面");
}
}
4,模拟ChromeDriver
packagefactory;publicclassChromeDriverimplementsWebDriver {
@OverridepublicvoidopenURL(String prmUrl) {
System.out.println("谷歌浏览器打开URL:" +prmUrl);
}
@OverridepublicString findElement(String prmFindTyp) {
System.out.println("谷歌浏览器定位元素方式:" +prmFindTyp);return"画面元素值为:ChromeDriver";
}
@OverridepublicvoidclosePage() {
System.out.println("谷歌浏览器关闭页面");
}
}
5,WebDriver实例工厂
packagefactory;publicclassWebDriverFacory {publicstaticWebDriver getBrowserInstance(String browserType){switch(browserType) {case"IE":returnnewInternetExplorerDriver();case"FireFox":returnnewFirefoxDriver();case"Google":returnnewChromeDriver();default:returnnewChromeDriver();
}
}publicstaticWebDriver getBrowserInstance(){returngetBrowserInstance("Google");
}
}
6,测试代码
packagefactory;importorg.junit.Test;publicclassWebDriverFacoryTest {
@TestpublicvoidtestIEDriver() {
WebDriver ied= WebDriverFacory.getBrowserInstance("IE");
ied.openURL("www.baidu.com");
ied.findElement("Xpath://div/a");
ied.closePage();
}
@TestpublicvoidtestFirefoxDriver() {
WebDriver ied= WebDriverFacory.getBrowserInstance("FireFox");
ied.openURL("www.baidu.com");
ied.findElement("Xpath://div/a");
ied.closePage();
}
@TestpublicvoidtestChromeDriver() {
WebDriver ied= WebDriverFacory.getBrowserInstance("Google");
ied.openURL("www.baidu.com");
ied.findElement("Xpath://div/a");
ied.closePage();
}
@TestpublicvoidtestDefaultDriver() {
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/aIE浏览器关闭页面
谷歌浏览器打开URL:www.baidu.com
谷歌浏览器定位元素方式:Xpath://div/a谷歌浏览器关闭页面
火狐浏览器打开URL:www.baidu.com
火狐浏览器定位元素方式:Xpath://div/a火狐浏览器关闭页面
谷歌浏览器打开URL:www.baidu.com
谷歌浏览器定位元素方式:Xpath://div/a谷歌浏览器关闭页面
总结:
工厂类负责创建的对象比较少;
客户只知道传入工厂类的参数(如上例子传参浏览器类型),对于如何创建对象(逻辑)不关心;
由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情况下应用。