抽象工厂设计模式
1.系统中有多个产品族,而系统一次只可能消费其中一族产品
2.同属于同一个产品族的产品以其使用。
来看看抽象工厂模式的各个角色(和工厂方法的如出一辙):
抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。
具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在java中它由具体的类来实现。
抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。
具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。
下面以IE,火狐,谷歌浏览器为模型做简单的说明
(1)抽象产品角色
package abstractFactory; /** * 抽象产品 ChromeDriver * @author Administrator * */ abstract class ChromeDriver { public abstract void openURL(String prmUrl); public abstract String findElement(String prmFindTyp); public abstract void closePage(); }
package abstractFactory; /** * 抽象产品 FirefoxDriver * @author Administrator * */ abstract class FirefoxDriver{ public abstract void openURL(String prmUrl); public abstract String findElement(String prmFindTyp); public abstract void closePage(); }
package abstractFactory; /** * 抽象产品 FirefoxDriver * @author Administrator * */ abstract class InternetExplorerDriver { public abstract void openURL(String prmUrl); public abstract String findElement(String prmFindTyp); public abstract void closePage(); }
(2)具体产品角色
package abstractFactory; /** * 具体产品 ChromeDriver * @author Administrator * */ public class ChromeDriverImpl extends ChromeDriver { @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 abstractFactory; /** * 具体产品 FirefoxDriver * @author Administrator * */ public class FirefoxDriverImpl extends FirefoxDriver { @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 abstractFactory; /** * 具体产品 InternetExplorerDriver * @author Administrator * */ public class InternetExplorerDriverImpl extends InternetExplorerDriver { @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 abstractFactory; /** * 简单的模拟 WebDriver的几个功能来说明工厂模式问题 * Selenium的Jar中有此类,且方法远远多于此 * @author Administrator * */ public abstract class WebDriver { public abstract ChromeDriver createChromeDriver(); public abstract FirefoxDriver createFirefoxDriver(); public abstract InternetExplorerDriver createIEDriver(); }
(4)具体工厂角色
package abstractFactory; /** * 具体工厂 * @author Administrator * */ public class WebDriverFactory extends WebDriver { @Override public ChromeDriver createChromeDriver() { return new ChromeDriverImpl(); } @Override public FirefoxDriver createFirefoxDriver() { return new FirefoxDriverImpl(); } @Override public InternetExplorerDriver createIEDriver() { return new InternetExplorerDriverImpl(); } }
(5)测试代码
package abstractFactory; import org.junit.Test; public class WebDriverFactoryTest { @Test public void testIEDriver() { WebDriver wd = new WebDriverFactory(); //IE InternetExplorerDriver ied = wd.createIEDriver(); ied.openURL("www.baidu.com"); ied.findElement("Xpath://div/a"); ied.closePage(); //火狐 FirefoxDriver ffd = wd.createFirefoxDriver(); ffd.openURL("www.baidu.com"); ffd.findElement("Xpath://div/a"); ffd.closePage(); //谷歌 ChromeDriver ggd = wd.createChromeDriver(); ggd.openURL("www.baidu.com"); ggd.findElement("Xpath://div/a"); ggd.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 谷歌浏览器关闭页面
代码拷来总觉浅,绝知此事要躬行