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

    一、定义

    抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定一个具体的类。

    二、优点

    1.方便更换产品的类型,由于具体工厂类在一个应用只需要初始化的时候出现一次,使得改变一个应用的具体工厂变得非常容易,只需改变具体的工厂即可使用不同的产品配置。

    2.让具体的创建实例过程与客户端分离。客户端通过抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离。

    三、示例代码

    利用抽象工厂模式操纵数据库。

    //抽象工厂类,利用了简单工厂模式+反射+读取配置文件来改造
    
    import org.dom4j.Attribute;
    import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.Element;
    import org.dom4j.io.SAXReader;
    
    public class DataAccess {
    
        private static String packageName = "com.pattern.abstractFactory.";
    
        private static String db = readDb();
    
        public static String readDb() {
            /*解析器*/
            SAXReader saxReader = new SAXReader();
            String db=null;
            /*读取配置文件*/
            try {
                Document document = saxReader.read("D:com\pattern\abstractFactory\AppConfig.xml");
                Element element = document.getRootElement();
                Element em = element.element("appSettings");
                 db = em.elementText("db");
            } catch (DocumentException e) {
                e.printStackTrace();
            }
    
            return db;
        }
    
        public static IUser createUser() {
            IUser dataClass = null;
            try {
                dataClass = (IUser) Class.forName(packageName + db + "User").newInstance();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InstantiationException e) {
                e.printStackTrace();
            }
            return dataClass;
        }
    
        public static IDepartment createDepart() {
            IDepartment dataClass = null;
            try {
                dataClass = (IDepartment) Class.forName(packageName + db + "Depart").newInstance();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InstantiationException e) {
                e.printStackTrace();
            }
            return dataClass;
        }
    
    }
    
    
    //抽象产品类
    
    public interface IUser {
       void insert(User user);
       User getUser(int id);
    }
    
    public interface IDepartment {
        void insert(Department department);
        Department getDepartment(int id);
    }
    
    //实体类
    public class User {
    
        private int id;
        private String name;
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
    }
    //实体类
    public class Department {
        private String departName;
        private int id;
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getDepartName() {
            return departName;
        }
    
        public void setDepartName(String departName) {
            this.departName = departName;
        }
    
    }
    //具体工厂类
    public class MysqlDepart implements IDepartment {
        @Override
        public void insert(Department department) {
            System.out.println("插入一条部门数据");
        }
    
        @Override
        public Department getDepartment(int id) {
            System.out.println("获取部门对象");
            return null;
        }
    
    
    }
    public class MysqlUser implements IUser {
        @Override
        public void insert(User user) {
            System.out.println("插入一条用户数据");
        }
    
        @Override
        public User getUser(int id) {
            System.out.println("获取用户对象");
            return null;
        }
    }
    public class OracleDepart implements IDepartment{
        @Override
        public void insert(Department department) {
            System.out.println("插入一条部门数据");
        }
    
        @Override
        public Department getDepartment(int id) {
            System.out.println("获取部门对象");
            return null;
        }
    
    
    }
    public class OracleUser implements IUser {
        @Override
        public void insert(User user) {
            System.out.println("插入一条用户数据");
        }
    
        @Override
        public User getUser(int id) {
            System.out.println("获取用户对象");
            return null;
        }
    }
    //客户端
    public class Client {
        public static void main(String[] args) {
           User user=new User();
            Department department=new Department();
            IUser iUser=DataAccess.createUser();
            iUser.insert(user);
           iUser.getUser(3);
          IDepartment iDepartment=DataAccess.createDepart();
          iDepartment.insert(department);
           iDepartment.getDepartment(5);
    
    
        }
    }
    
    
    //配置文件
    <?xml version="1.0" encoding="UTF-8" ?>
    <configuration>
        <appSettings>
          <db>Mysql</db>
        </appSettings>
    </configuration>
    
    
  • 相关阅读:
    Atcoder D
    51nod 1201 整数划分(dp)
    Atcoder D
    Atcoder C
    codeforces 812 E. Sagheer and Apple Tree(树+尼姆博弈)
    codeforces 811 D. Vladik and Favorite Game(bfs水题)
    codeforces 811 E. Vladik and Entertaining Flags(线段树+并查集)
    codeforces 811 C. Vladik and Memorable Trip(dp)
    1449 砝码称重(思维)
    SQL大量数据查询的优化 及 非用like不可时的处理方案
  • 原文地址:https://www.cnblogs.com/yfy-/p/12199336.html
Copyright © 2011-2022 走看看