抽象工厂设计模式

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. 关于SharpZipLib压缩分散的文件及整理文件夹的方法

    今天为了解决压缩分散的文件时,发现想通过压缩对象直接进行文件夹整理很麻烦,因为SharpZipLib没有提供压缩进某个指定文件夹的功能,在反复分析了SharpZipLib提供的各个接口方法后,终于找到 ...

  2. 如何让textarea不可拖拽

    文本域textarea有一个特性,就是可以拖拽改变其大小,但是在布局严格要求的页面中,这种特性显然会影响布局. 一行代码就可以搞定: textarea{ resize:none;} 但是在chrome ...

  3. 从SQL下载大量数据到Excel

    之前不知设计原理,发生了大量数据(超过100w行)直接从数据库读取加载到网页中,直接导致内存溢出. Rediculous! 所以,现在改为分页查询到页面中. 由于其有全局逻辑,故折中每次加载1w条数据 ...

  4. 利用Native Client OLEDB 11 高效率地对SQL SERVER 进行查询和插入操作

    前言: 鄙司原始用的都是ADO来访问数据库,而我现在着手的项目是从我的GPS历史数据库中,取出历时数据的一个接口,一个DLL.用ADO写完之后,测试下来,平均4000条的数据,需要 180 毫秒左右. ...

  5. HTML DOM 方法

    一.HMTL DOM对象 --方法和属性 1.1常用的方法. 1.getElementByld( id )方法 --获取带有指定id 的节点( 元素 ) 2.appendChild( node )方法 ...

  6. 08JAVA多态

    //我并没有用多态,因为我也不知道怎么用多态实现ATM操作流程/* * 模拟ATM机 * 徐浩军 20153153 */ package 中转; import java.util.Scanner; p ...

  7. .NET HttpClient扩展

    /// <summary> /// HttpClient扩展类 /// </summary> public static class HttpClientExtensions ...

  8. Python之字符串小代码解析

    本篇只是拿一段代码来对python中的字符串的一些使用做解释,来让大家更加了解python Python 3.4.0 (v3.4.0:04f714765c13, Mar 16 2014, 19:25: ...

  9. softmax分类器+cross entropy损失函数的求导

    softmax是logisitic regression在多酚类问题上的推广,\(W=[w_1,w_2,...,w_c]\)为各个类的权重因子,\(b\)为各类的门槛值.不要想象成超平面,否则很难理解 ...

  10. android中回调函数机制完全解析

    1.在要调用的业务操作中,创建一个接口,在接口中创建方法,这个方法表示的是我们原先要在业务类中执行的操作 public interface BackUpSmsListener { /** * 设置总进 ...