1. 程式人生 > >《Head First 設計模式》之抽象工廠模式

《Head First 設計模式》之抽象工廠模式

《head first》書上舉的例子講的還是Pizza的例子,只不過這次是用的原料來模擬抽象共工廠模式,類太多,感覺還是大話的這個例子更貼近一點,類相對來說也少,更加清晰。大話上的例子說的是利用抽象工廠模式模擬實現不同資料庫的資料訪問

抽象工廠模式提供了一個介面,用於建立相關或依賴物件的家族,而不需要明確制定具體類。


感覺看例子還是非常容易懂的。

1.首先是兩個實體類,此處只列出User,Department一樣

package abstractfactory;

public class User {
	private int _id;
	private String name;
	public int get_id() {
		return _id;
	}
	public void set_id(int _id) {
		this._id = _id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}
2.IUser介面,借出於具體資料庫訪問的耦合,感覺有點像實現DAO層時,先定義增刪改查等各種方法的介面,IDepartment介面定義類似
package abstractfactory;

public interface IUser {
	public void insert(User user);
	public User getUser(int id);
}
3.針對IUser介面的實現,模擬SqlServer和Access的資料庫操作。

SqlServerUser類

package abstractfactory;

public class SqlServerUser implements IUser{
	public User getUser(int id) {
		System.out.println("在SQL SERVER中根據ID得到User表的一條記錄");
		return null;
	}
	
	public void insert(User user) {
		System.out.println("在SQL SERVER中給User表增加一條記錄");
	}
}
AccessUser類
package abstractfactory;

public class AccessUser implements IUser {

	public User getUser(int id) {
		System.out.println("在Access中根據ID得到User表的一條記錄");
		return null;
	}
	
	public void insert(User user) {
		System.out.println("在Access中給User表增加一條記錄");
	}

}
3.IFactory介面,定義一個訪問資料庫表物件的抽象的工廠介面,相當於圖中的AbstractFactory
package abstractfactory;

public interface IFactory {
	IDepartment createDepartment();
	IUser createUser();
}
對IFactory的實現類SqlServerFactory 
package abstractfactory;

public class SqlServerFactory implements IFactory{
	public IDepartment createDepartment() {
		return new SqlServerDepartment();
	}
	
	public IUser createUser() {
		return new SqlServerUser();
	}
}
對IFactory的實現類AccessFactory
package abstractfactory;

public class AccessFactory implements IFactory{
	public IDepartment createDepartment() {
		return new AccessDepartment();
	}
	
	public IUser createUser() {
		return new AccessUser();
	}
}
4.最後是測試類
package abstractfactory;

public class Test {
	public static void main(String[] args) {
		User user = new User();
		Department department = new Department();
		
		IFactory factory = new SqlServerFactory();
		//factory = new AccessFactory();
		IUser iUser = factory.createUser();
		
		iUser.insert(user);
		iUser.getUser(1);
		
		IDepartment id = factory.createDepartment();
		
		id.insert(department);
		id.getDepartment(1);
	}
}

從上面的例子中,我們可以看到全部都是一個介面,然後一個實現類,除了實體類和測試類之外,我們很明顯可以看到抽象工廠的缺點就是類太多,比如增加個一個實體類Entity,不是又需要新增IEntity、SqlServerEntity、AccessEntity等,所以書中改進的方法是利用了簡單工廠替換抽象工廠,針對不同的實體都變成DataAcess類的靜態方法。


應用的話,感覺就這個例子就挺形象的,如果我們封裝了此處的IUser,把它設計成系統的DAO層,通過這樣的封裝,可以遮蔽掉不同的資料庫訪問的差異,可以快速的在不同資料庫之間相互切換。其實針對不同的資料庫的訪問,更常見的是根據反射+配置檔案實現資料訪問程式,一般web程式中都是自定義一個jdbc.properites檔案,該檔案是一個個鍵值對,定義連線資料庫的配置屬性。

如果文章有什麼錯誤或者有什麼建議,歡迎提出,大家共同交流,一起進步

文章轉載請註明出處,請尊重智慧財產權