码迷,mamicode.com
首页 > 其他好文 > 详细

抽象工厂模式

时间:2020-01-16 00:36:35      阅读:84      评论:0      收藏:0      [点我收藏+]

标签:配置文件   pattern   sse   config   try   iat   解析   tac   version   

一、定义

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

二、优点

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>

抽象工厂模式

标签:配置文件   pattern   sse   config   try   iat   解析   tac   version   

原文地址:https://www.cnblogs.com/yfy-/p/12199336.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!