zoukankan      html  css  js  c++  java
  • JAVA设计模式抽象工厂模式

    抽象工厂设计模式

    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
    谷歌浏览器关闭页面
    代码拷来总觉浅,绝知此事要躬行
  • 相关阅读:
    FZU 2150 Fire Game
    POJ 3414 Pots
    POJ 3087 Shuffle'm Up
    POJ 3126 Prime Path
    POJ 1426 Find The Multiple
    POJ 3278 Catch That Cow
    字符数组
    HDU 1238 Substing
    欧几里德和扩展欧几里德详解 以及例题CodeForces 7C
    Codeforces 591B Rebranding
  • 原文地址:https://www.cnblogs.com/yinxiaoqiexuxing/p/5625305.html
Copyright © 2011-2022 走看看