學習設計模式有一段時間了,對設計模式有一個體會,就是沒那麼難,就是設計程序遵循一些原則,讓代碼可複用,在修改的時候不用涉及太多的類,擴展方便,抽象工廠模式名字聽起來抽象,但理解起來一點也不抽象,用語言可能不好理解,我喜歡通過代碼理解,然後成爲自己的東西。
抽象工廠模式:提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。
<<大話設計模式>>以項目上線時想換另外一個數據庫爲例子展開的,假如我沒原來用的是SqlServer,現在換成access,代碼如下:
1、訪問數據庫工廠
/**
* @author jzhf
* 2014-11-03
* 創建一個訪問user的工廠接口
*/
public interface IFactory {
IUser createUser();
IDepartment createDepartment();
}
IUser指的是對用戶表的操作,IDepartment指的是對部門表的操作,關於這兩個類在下面有介紹。
2、SqlServer數據庫工廠類操作
public class SqlServerFactory implements IFactory {
/* (non-Javadoc)
* @seecom.test.model.abstractFactory.IFactory#createUser()
*/
public IUser createUser() {
// TODO Auto-generatedmethod stub
return new SqlServerUser();
}
/* (non-Javadoc)
* @seecom.test.model.abstractFactory.IFactory#createDepartment()
*/
public IDepartment createDepartment() {
// TODO Auto-generatedmethod stub
return new SqlServerDepartment();
}
}
3、具體類,對user操作
/**
* @author jzhf
* 2014-10-31
*/
public class SqlServerUser implements IUser {
/* (non-Javadoc)
* @seecom.test.model.abstractFactory.IUser#getUser(int)
*/
public void getUser(int id) {
// TODO Auto-generatedmethod stub
System.out.println("sqlserverget User by Id");
}
/* (non-Javadoc)
* @seecom.test.model.abstractFactory.IUser#insert(com.test.model.abstractFactory.User)
*/
public void insert(User user) {
// TODO Auto-generatedmethod stub
System.out.println("sqlserverinsert user");
}
}
4、用戶接口
public interface IUser {
void insert(User user);
void getUser(int id);
}
5、部門類與用戶代碼差不多,略;access數據庫代碼與SqlServer數據庫代碼一致,略
6、客戶端
public class UserClient {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generatedmethod stub
IFactory factory = new SqlServerFactory();
IUser iUser = factory.createUser();
User user = new User();
user.setId(0);
user.setName("小王");
iUser.insert(user);
iUser.getUser(0);
IFactory factory2 = new AccessFactory();
IUser iUser2 = factory2.createUser();
iUser2.insert(user);
iUser2.getUser(0);
//-----------增加部門接口之後-----------
IDepartment iDepartment = factory.createDepartment();
//然後修改insert傳入的值
}
}
從代碼和下面的圖標可以看到,IFactory是抽象工廠接口,它裏面包含所有的產品創建的抽象方法,而SqlServerFactory和accessFactory就是具體的工廠,這個具體的工廠然後創建具有特定實現的產品對象,也就是說,爲創建不同的產品對象,客戶端應使用不同的具體工廠。
抽象工廠優缺點
優點:易於交換產品系列,由於具體工廠類,在一個應用中只需要在初始化的時候出現一次,這就使得改變一個應用的具體工廠變得非常容易,它只需要改變具體工廠即可使用不同的產品配置。第二個優點是它讓具體的創建實例過程與客戶端分離,客戶端是通過它們的抽象接口操縱實例,產品的具體類名也被具體工廠的實現分離,不會出現在客戶端代碼中。遵循了開放-封閉原則和依賴倒轉原則。
缺點也是有的如果我要增加功能,則需要增家三個類,抽象工廠類,工廠具體類和具體實現類,還需要更改原抽象工廠纔可以完全實現,非常麻煩。
最後附上結構圖: