首页 > 学院 > 开发设计 > 正文

抽象工厂模式

2019-11-08 18:42:09
字体:
来源:转载
供稿:网友

抽象工厂模式:为一组相关或者相互依赖的对象提供一个接口,而且无需指定他们的具体类。

工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。

用了工厂方法模式的数据访问程序

User.java用户类(只有ID和Name两个字段)

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; }}

IUser.java-用于对User进行操作的通用接口

public interface IUser { void insert(User user); User getUser(int id);}

accessUser.java-对数据库操作的具体实现

public class AccessUser implements IUser{ @Override public void insert(User user) { System.out.println("在Access中给User表增加一条记录"); } @Override public User getUser(int id) { System.out.println("在Access中根据ID获取User表中的一条记录"); return null; }}

SqlServerUser.java-对数据库操作的具体实现

public class SqlServerUser implements IUser{ @Override public void insert(User user) { System.out.println("在SQL Server中给User表增加一条记录"); } @Override public User getUser(int id) { System.out.println("在SQL Server中根据ID获取User表中的一条记录"); return null; }}

IFactory.java-用于创建访问user表的对象

public interface IFactory { IUser createUser();}

sqlServerFactory.java-实现IFactory接口,创建sqlServerUser对象

public class SqlServerFactory implements IFactory{ @Override public IUser createUser() { return new SqlServerUser(); }}

AccessFactory.java-实现IFactory接口,创建AccessUser对象

public class AccessFactory implements IFactory{ @Override public IUser createUser() { return new AccessUser(); }}

测试

public class Test { public static void main(String[] args) { User user = new User(); SqlServerFactory sqlServerFactory = new SqlServerFactory(); IUser createUser = sqlServerFactory.createUser(); createUser.insert(user); createUser.getUser(1); }}

输出

改进(去除IFactory、SqlServerFactory、AccessFactory三个工厂,取而代之DataAccess类,用一个简单工厂模式实现)

DataAccess.java

public class DataAccess { private static final String db="SqlServer";// private static final String db="Access"; public static IUser createUser(){ IUser result=null; switch(db){ case "SqlServer":result=new SqlServerUser(); break; case "Access":result=new AccessUser();break; } return result; } public static IDepartment createDepartment(){ IDepartment result=null; switch(db){ case "SqlServer":result=new SqlServerDepartment(); break; case "Access":result=new AccessDepartment();break; } return result; }}

测试

public class Test2 { public static void main(String[] args) { User user = new User(); Department department = new Department(); IUser iu = DataAccess.createUser(); IDepartment id = DataAccess.createDepartment(); iu.insert(user); iu.getUser(1); id.insert(department); id.getUser(1); }}

用反射+抽象工厂进行数据访问

通过反射实现程序由编译时创建对象变为运行时创建对象,通过字符串来实例化对象。 DataAccessR类利用反射技术,取代IFactory、SqlServerFactory、AccessFactory三个工厂

DataAccessR.java

public class DataAccessR { private static final String commonPackageName="zx.abstractfactory.test2"; private static final String db="sqlserver"; public static IUser createUser() throws InstantiationException, IllegalAccessException, ClassNotFoundException{ String className=commonPackageName+"."+db+".SqlServerUser"; System.out.println("SqlServerUser的全路径名 "+className); IUser sqlServerUser=(SqlServerUser)Class.forName(className).newInstance(); return sqlServerUser; } public static IDepartment createDepartment() throws InstantiationException, IllegalAccessException, ClassNotFoundException{ String className=commonPackageName+"."+db+".SqlServerDepartment"; System.out.println("SqlServerDepartment的全路径名 "+className); IDepartment sqlServerDepartment=(SqlServerDepartment)Class.forName(className).newInstance(); return sqlServerDepartment; }}

测试

public class TestR { public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException { User user = new User(); Department department = new Department(); IUser createUser = DataAccessR.createUser(); IDepartment createDepartment = DataAccessR.createDepartment(); createUser.insert(user); createUser.getUser(1); createDepartment.insert(department); createDepartment.getUser(1); System.out.println("testR"); }}

输出


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表