国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

抽象工廠模式

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

輸出


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 屏边| 苏尼特右旗| 章丘市| 揭东县| 嘉定区| 梨树县| 太和县| 元阳县| 阿合奇县| 普兰店市| 胶南市| 东城区| 宣武区| 安康市| 勐海县| 宁远县| 昂仁县| 平南县| 望城县| 临猗县| 基隆市| 托克逊县| 泸定县| 抚顺县| 安宁市| 溧水县| 石门县| 庄浪县| 外汇| 巴南区| 麻江县| 刚察县| 西和县| 邳州市| 富锦市| 北辰区| 柯坪县| 江西省| 伽师县| 南宫市| 漳浦县|