JAVA设计模式--抽象工厂模式
2016-06-28 22:59
260 查看
抽象工厂设计模式
1.系统中有多个产品族,而系统一次只可能消费其中一族产品
2.同属于同一个产品族的产品以其使用。
来看看抽象工厂模式的各个角色(和工厂方法的如出一辙):
抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。
具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在java中它由具体的类来实现。
抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。
具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。
下面以IE,火狐,谷歌浏览器为模型做简单的说明
(1)抽象产品角色
(2)具体产品角色
(3)抽象工厂角色
(4)具体工厂角色
(5)测试代码
(6)测试结果
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 谷歌浏览器关闭页面
相关文章推荐
- Spring中bean用法详解
- Spring LDAP
- Java 分治法 求解一组数组元素的最大值和最小值
- 使用IntelliJ IDEA 14和Maven创建java web项目
- Struts2中Action需要用Servlet API的方法
- 使用Eclipse连接hbase1.1 hadoop2.6
- Eclipse相关配置
- JavaSE 基础 第10节 初识字符串
- java filechannel
- 注解与反射
- Java 框架
- Struts2中Action接受用户输入数据
- JavaSE 基础 第09节 赋值与初始化
- JAVA内存模型
- java之远程接口调用
- Java基础与案例开发详解の抽象和封装
- servlet 和filter区别和servlet、filter、interceptor的执行顺序
- java 高级特性-反射
- java对象、重载、访问控制符
- MyEclipse2014搭建SSH框架