抽象工廠模式:為一組相關或者相互依賴的對象提供一個接口,而且無需指定他們的具體類。
工廠方法模式:定義一個用于創建對象的接口,讓子類決定實例化哪一個類。
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);}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); }}輸出 
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"); }}輸出 
新聞熱點
疑難解答