• 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
    谷歌浏览器关闭页面
  • 相关阅读:
    Visual Studio中View页面与Js页面用快捷键互相跳转
    使用NLog记录业务日志到数据库
    Js笛卡尔乘积
    多线程更新一个表里面的不同行也可能会死锁
    当请求参数与网站编码不一致时乱码解决方法
    WIN7下vs2010滑轮滚动不正确的解决方法
    VS 2017 代码报错编译正常
    C#表达式树
    .net core 学习 读取配置文件
    .net core 上传文件Demo
  • 原文地址:https://www.cnblogs.com/mark5/p/11752875.html
Copyright © 2020-2023  润新知