抽象工厂设计模式

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
谷歌浏览器关闭页面

JAVA设计模式--抽象工厂模式的更多相关文章

  1. Java设计模式-抽象工厂模式(Abstract Factory )

    工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这 ...

  2. 2.java设计模式-抽象工厂模式

    抽象工厂模式简介: 每一个模式都是针对某一种问题的解决方案.抽象工厂模式与工厂模式最大的区别在于,工厂模式针对的是一个产品等级结构,而抽象工厂模式面对的是多个产品等级结构,即产品族的概念. 这里讲解一 ...

  3. Java设计模式-抽象工厂模式(Abstarct Factory)

    抽象工厂模式 举个生活中常见的例子,组装电脑,在组装电脑时,通常需要选择一系列的配件,比如CPU,硬盘,内存,主板,电源,机箱等,为了讨论使用简单,值考虑选择CPU和主板的问题. 事实上,在选择CPU ...

  4. Java设计模式——抽象工厂模式

    抽象工厂模式也是创建模式,可以把它理解成创建工厂的工厂,这种模式也是我们经常使用的.在抽象工厂中的接口是用来创建工厂的,每个生成的工厂又都可以按照工厂模式创建其他对象. 举例说明: 创建Shape接口 ...

  5. 设计模式——抽象工厂模式及java实现

    设计模式--抽象工厂模式及java实现 设计模式在大型软件工程中很重要,软件工程中采用了优秀的设计模式有利于代码维护,方便日后更改和添加功能. 设计模式有很多,而且也随着时间在不断增多,其中最著名的是 ...

  6. 浅析JAVA设计模式之工厂模式(一)

    1 工厂模式简单介绍 工厂模式的定义:简单地说,用来实例化对象,取代new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ...

  7. Java设计模式之工厂模式(Factory模式)介绍(转载)

    原文见:http://www.jb51.net/article/62068.htm 这篇文章主要介绍了Java设计模式之工厂模式(Factory模式)介绍,本文讲解了为何使用工厂模式.工厂方法.抽象工 ...

  8. Java 设计模式之工厂模式(二)

    原文地址:Java 设计模式之工厂模式(二) 博客地址:http://www.extlight.com 一.背景 本篇内容是 Java 设计模式创建型模式的第二篇.上一篇主题为 <Java 设计 ...

  9. 浅析JAVA设计模式之工厂模式(二)

    1 工厂方法模式简单介绍 工厂方法 (Factroy Method)模式:又称多态性工厂模式(Polymorphic Factory),在这样的模式中,核心工厂不再是一个详细的类.而是一个抽象工厂,提 ...

随机推荐

  1. Xilium.CefGlue CEF Chrome 自动上传文件不弹出对话框 CefDialogHandler

    关键代码如下,如何使用Handler,还不清楚的请继续搜索 internal sealed class WyzCefDialogHandler : CefDialogHandler    {      ...

  2. AWT布局管理器

    布局管理器 容器内可以存放各种组件,而组件的位置和大小是由容器内的布局管理器来决定的.在AWT中为我们提供了以下5种布局管理器: ①   FlowLayout 流式布局管理器 ②   BorderLa ...

  3. Spring Framework------>version4.3.5.RELAESE----->Reference Documentation学习心得----->使用spring framework的IoC容器功能----->方法一:使用XML文件定义beans之间的依赖注入关系

    XML-based configuration metadata(使用XML文件定义beans之间的依赖注入关系) 第一部分 编程思路概述 step1,在XML文件中定义各个bean之间的依赖关系. ...

  4. 使用CSS3动画库animate.css

    IE9及更早版本的IE浏览器都不支持css3动画 谷歌浏览器.火狐浏览器.IE10+浏览器以及移动端浏览器等这些都支持css3动画 animate.css内置了很多典型的css3动画   用法   1 ...

  5. 滚动监听(bootstrap)

    1.05 腊八节   一直都想知道滚动监听是怎么做出来的,今天终于扒拉出来了,在使用的时候只要加上div定位就可以了... <head> <link rel="styles ...

  6. 如何使用matplotlib绘制一个函数的图像

    我们经常会遇到这种情况,有一个数学函数,我们希望了解他的图像,这个时候使用python 的matplotlib就可以帮助我们. 用sigmoid函数来举个例子. sigmoid函数: 代码: impo ...

  7. java_js_json_日期格式化

    调用方法: var createBeginTime= createBeginTime.Format("yyyy-MM-dd 00:00:00"); 方法: Date.prototy ...

  8. 关于rem的计算顺序

    /*响应式字体*//* * 字体响应式 * 屏幕>640px时,html字体大小 * 屏幕<640px时,html字体根据屏幕做出相应  * */(function(doc,win){   ...

  9. Hibernate持久化类属性映射

    Hibernate充当应用程序和数据库之间的中间件,实现二者之间的交互操作,他对JDBC进行了封装,以完全面向对象的方式来操作数据. 适用于有多个数据源的情况下,不必去考虑不同数据源的操作差异. Hi ...

  10. python学习之——eclipse+pydev 环境搭建

    最终选用 eclipse+pydev,网上相关资料也是极多的~~~ 1.安装python: 2.安装eclipse: 3.eclipse中安装pydev,eclipse中help—>eclipl ...