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
    谷歌浏览器关闭页面
  • 相关阅读:
    bzoj 1176 cdq分治套树状数组
    Codeforces 669E cdq分治
    Codeforces 1101D 点分治
    Codeforces 1100E 拓扑排序
    Codeforces 1188D Make Equal DP
    Codeforces 1188A 构造
    Codeforces 1188B 式子转化
    Codeforces 1188C DP 鸽巢原理
    Codeforces 1179D 树形DP 斜率优化
    git commit -m "XX"报错 pre -commit hook failed (add --no-verify to bypass)问题
  • 原文地址:https://www.cnblogs.com/mark5/p/11752875.html
Copyright © 2011-2022 走看看