讀之抽象工廠模式


         學習設計模式有一段時間了,對設計模式有一個體會,就是沒那麼難,就是設計程序遵循一些原則,讓代碼可複用,在修改的時候不用涉及太多的類,擴展方便,抽象工廠模式名字聽起來抽象,但理解起來一點也不抽象,用語言可能不好理解,我喜歡通過代碼理解,然後成爲自己的東西。

抽象工廠模式:提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。

         <<大話設計模式>>以項目上線時想換另外一個數據庫爲例子展開的,假如我沒原來用的是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就是具體的工廠,這個具體的工廠然後創建具有特定實現的產品對象,也就是說,爲創建不同的產品對象,客戶端應使用不同的具體工廠。

抽象工廠優缺點

         優點:易於交換產品系列,由於具體工廠類,在一個應用中只需要在初始化的時候出現一次,這就使得改變一個應用的具體工廠變得非常容易,它只需要改變具體工廠即可使用不同的產品配置。第二個優點是它讓具體的創建實例過程與客戶端分離,客戶端是通過它們的抽象接口操縱實例,產品的具體類名也被具體工廠的實現分離,不會出現在客戶端代碼中。遵循了開放-封閉原則和依賴倒轉原則。

缺點也是有的如果我要增加功能,則需要增家三個類,抽象工廠類,工廠具體類和具體實現類,還需要更改原抽象工廠纔可以完全實現,非常麻煩。

最後附上結構圖:

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章