工厂方法设计模式
抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。
具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在java中它由具体的类来实现。
抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。
具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。
下面以IE,火狐,谷歌浏览器为模型做简单的说明
(1)抽象产品角色
定义三种浏览器共同的特性
package factoryMethod; /** * 简单的模拟 WebDriver的几个功能来说明工厂模式问题 * Selenium的Jar中有此类,且方法远远多于此 * @author Administrator * */ public interface WebDriver { //打开页面 public void openURL(String prmUrl); //查找元素 public String findElement(String prmFindTyp); //关闭页面 public void closePage(); }
(2)具体产品角色
谷歌等三种浏览器的具体产品实现
package factoryMethod; 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("谷歌浏览器关闭页面"); } }
package factoryMethod; 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("火狐浏览器关闭页面"); } }
package factoryMethod; 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浏览器关闭页面"); } }
(3)抽象工厂角色
package factoryMethod; /** * 抽象工厂 * @author Administrator * */ public abstract class WebDriverFactory{ public abstract WebDriver createDriver(); }
(4)具体工厂角色
分别产生三种浏览器产品对应的工厂
package factoryMethod; /** * 具体工厂 * @author Administrator * */ public class ChromeDriverFactory extends WebDriverFactory { @Override public WebDriver createDriver() { return new ChromeDriver(); } }
package factoryMethod; /** * 具体工厂 * @author Administrator * */ public class FirefoxDriverFactory extends WebDriverFactory { @Override public WebDriver createDriver() { return new FirefoxDriver(); } }
package factoryMethod; public class InternetExplorerDriverFactory extends WebDriverFactory { @Override public WebDriver createDriver() { return new InternetExplorerDriver(); } }
(5)测试代码
package factoryMethod; import org.junit.Test; public class WebDriverFactoryTest { @Test public void testIEDriver() { WebDriverFactory ief = new InternetExplorerDriverFactory(); WebDriver ied = ief.createDriver(); ied.openURL("www.baidu.com"); ied.findElement("Xpath://div/a"); ied.closePage(); } @Test public void testFirefoxDriver() { WebDriverFactory fff = new FirefoxDriverFactory(); WebDriver ffd = fff.createDriver(); ffd.openURL("www.baidu.com"); ffd.findElement("Xpath://div/a"); ffd.closePage(); } @Test public void testChromeDriver() { WebDriverFactory crf = new ChromeDriverFactory(); WebDriver crd = crf.createDriver(); crd.openURL("www.baidu.com"); crd.findElement("Xpath://div/a"); crd.closePage(); } }
(6)测试结果
IE浏览器打开URL:www.baidu.com IE浏览器定位元素方式:Xpath://div/a IE浏览器关闭页面 火狐浏览器打开URL:www.baidu.com 火狐浏览器定位元素方式:Xpath://div/a 火狐浏览器关闭页面 谷歌浏览器打开URL:www.baidu.com 谷歌浏览器定位元素方式:Xpath://div/a 谷歌浏览器关闭页面
代码拷来总觉浅,绝知此事要躬行