一、定义
抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定一个具体的类。
二、优点
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>
来源:https://www.cnblogs.com/yfy-/p/12199336.html