少年阿賓

          那些青春的歲月

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks

          常用鏈接

          留言簿(22)

          我參與的團隊

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

                   每個模式都是針對一定問題的解決方案。抽象工廠模式面對的問題是多產品等級結構的系統設計。
                   在學習抽象工廠具體實例之前,應該明白兩個重要的概念:產品族和產品等級。

                   產品族:是指位于不同產品等級結構中,功能相關聯的產品組成的家族。比如AMD的CPU和ADM芯片的主板,組成一個家族。Intel的CPU和Intel芯片的主板,又組成一個家族。而這兩個家族都來自于兩個產品等級:CPU,主板。一個等級結構是由相同的結構的產品組成,示意圖如下:


           理解這個產品結構是理解抽象工廠模式的關鍵所在,從上圖可以看出,抽象工廠模式的每個工廠創造出來的都是一族產品,而不是一個或者一組。組是可以隨意組合的!其實工廠方法模式和抽象工廠模式就這點點差別。

          【1】基本概念

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

          【2】簡單分析

          我們先看一下抽象工廠模式的UML結構圖:

          上圖是 Abstract Factory 模式結構圖,讓我們可以進行更加方便的描述:

          1. AbstractProduct: 抽象產品,它們都有可能有兩種不同的實現。
          2. ConcreteProduct:包括ProductA和ProductB, 對兩個抽象產品的具體分類的實現。
          3. AbstractFactory: 抽象工廠接口,它里面應該包含所有的產品創建的抽象方法。
          4. ConcreteFactory: 包括ConcreteFactoryA和ConcreteFactoryB,具體的工廠,創建具有特定實現的產品對象。
          【3】如何用java語言來實現該模式
          背景:用一個分別對不同數據庫(Oracle 或 SQL Server)中表( User 和 Department )的操作的實例來展示該設計模式。先看下代碼的結構圖:


          3.1 首先定義兩個抽象的產品類:IUser.java 和 IDepartment.java。

          IUser.java的源碼:

          1. package com.andyidea.patterns.abstractproduct;  
          2.   
          3. /**  
          4.  * 抽象產品角色:User接口  
          5.  * @author Andy.Chen  
          6.  *  
          7.  */  
          8. public interface IUser {  
          9.   
          10. }  
          IDepartment.java源碼:

           

          1. package com.andyidea.patterns.abstractproduct;  
          2.   
          3. /**  
          4.  * 抽象產品角色:Department接口  
          5.  * @author Andy.Chen  
          6.  *  
          7.  */  
          8. public interface IDepartment {  
          9.   
          10. }  
          3.2 定義抽象工廠類:IDBFactory.java

           

          1. package com.andyidea.patterns.abstractfactory;  
          2.   
          3. import com.andyidea.patterns.abstractproduct.IDepartment;  
          4. import com.andyidea.patterns.abstractproduct.IUser;  
          5.   
          6. /**  
          7.  * 抽象工廠角色:工廠接口  
          8.  * @author Andy.Chen  
          9.  *  
          10.  */  
          11. public interface IDBFactory {  
          12.   
          13.     public IUser createUser();  
          14.     public IDepartment createDepartment();  
          15. }  
          3.3創建具體產品角色類:OracleOfUser.java;OracleOfDepartment.java;SQLServerOfUser.java;SQLServerOfDepartment.java。分別繼承IUser.java和IDepartment.java。

           

          OracleOfUser.java源碼:

          1. package com.andyidea.patterns.concreteproduct;  
          2.   
          3. import com.andyidea.patterns.abstractproduct.IUser;  
          4.   
          5. /**  
          6.  * 具體產品角色:Oracle中的User  
          7.  * @author Andy.Chen  
          8.  *  
          9.  */  
          10. public class OracleOfUser implements IUser{  
          11.       
          12.     public OracleOfUser(){  
          13.         System.out.println("Oracle工廠:在Oracle中操作User表.");  
          14.     }  
          15.   
          16. }  
          OracleOfDepartment.java源碼:

           

          1. package com.andyidea.patterns.concreteproduct;  
          2.   
          3. import com.andyidea.patterns.abstractproduct.IDepartment;  
          4.   
          5. /**  
          6.  * 具體產品角色:Oracle中的Department  
          7.  * @author Andy.Chen  
          8.  *  
          9.  */  
          10. public class OracleOfDepartment implements IDepartment{  
          11.       
          12.     public OracleOfDepartment(){  
          13.         System.out.println("Oracle工廠:在Oracle中操作Department表.");  
          14.     }  
          15.   
          16. }  
          SQLServerOfUser.java源碼:

           

          1. package com.andyidea.patterns.concreteproduct;  
          2.   
          3. import com.andyidea.patterns.abstractproduct.IUser;  
          4.   
          5. /**  
          6.  * 具體產品角色:SQL Server中的User  
          7.  * @author Andy.Chen  
          8.  *  
          9.  */  
          10. public class SQLServerOfUser implements IUser{  
          11.       
          12.     public SQLServerOfUser(){  
          13.         System.out.println("SQL Server工廠:在SQL Server中操作User表.");  
          14.     }  
          15.   
          16. }  
          SQLServerOfDepartment.java源碼:

           

          1. package com.andyidea.patterns.concreteproduct;  
          2.   
          3. import com.andyidea.patterns.abstractproduct.IDepartment;  
          4.   
          5. /**  
          6.  * 具體產品角色:SQL Server中的Department  
          7.  * @author Andy.Chen  
          8.  *  
          9.  */  
          10. public class SQLServerOfDepartment implements IDepartment{  
          11.       
          12.     public SQLServerOfDepartment(){  
          13.         System.out.println("SQL Server工廠:在SQL Server中操作Department表.");  
          14.     }  
          15.   
          16. }  
          3.4 創建具體工廠類:OracleFactory.java和SQLServerFactory.java。

           

          OracleFactory.java源碼:

          1. package com.andyidea.patterns.concretefactory;  
          2.   
          3. import com.andyidea.patterns.abstractfactory.IDBFactory;  
          4. import com.andyidea.patterns.abstractproduct.IDepartment;  
          5. import com.andyidea.patterns.abstractproduct.IUser;  
          6. import com.andyidea.patterns.concreteproduct.OracleOfDepartment;  
          7. import com.andyidea.patterns.concreteproduct.OracleOfUser;  
          8.   
          9. /**  
          10.  * 具體工廠角色:Oracle工廠  
          11.  * @author Andy.Chen  
          12.  *  
          13.  */  
          14. public class OracleFactory implements IDBFactory{  
          15.   
          16.     @Override  
          17.     public IUser createUser() {  
          18.         return new OracleOfUser();  
          19.     }  
          20.   
          21.     @Override  
          22.     public IDepartment createDepartment() {  
          23.         return new OracleOfDepartment();  
          24.     }  
          25.   
          26. }  
          SQLServerFactory.java源碼:

           

          1. package com.andyidea.patterns.concretefactory;  
          2.   
          3. import com.andyidea.patterns.abstractfactory.IDBFactory;  
          4. import com.andyidea.patterns.abstractproduct.IDepartment;  
          5. import com.andyidea.patterns.abstractproduct.IUser;  
          6. import com.andyidea.patterns.concreteproduct.SQLServerOfDepartment;  
          7. import com.andyidea.patterns.concreteproduct.SQLServerOfUser;  
          8.   
          9. /**  
          10.  * 具體工廠角色:SQL Server工廠  
          11.  * @author Andy.Chen  
          12.  *  
          13.  */  
          14. public class SQLServerFactory implements IDBFactory{  
          15.   
          16.     @Override  
          17.     public IUser createUser() {  
          18.         return new SQLServerOfUser();  
          19.     }  
          20.   
          21.     @Override  
          22.     public IDepartment createDepartment() {  
          23.         return new SQLServerOfDepartment();  
          24.     }  
          25.   
          26. }  
          3.5 客戶端測試類:AbstractFactoryClient.java

           

          1. package com.andyidea.patterns.client;  
          2.   
          3. import com.andyidea.patterns.abstractproduct.IDepartment;  
          4. import com.andyidea.patterns.abstractproduct.IUser;  
          5. import com.andyidea.patterns.concretefactory.OracleFactory;  
          6. import com.andyidea.patterns.concretefactory.SQLServerFactory;  
          7.   
          8. /**  
          9.  * 抽象工廠測試類  
          10.  * @author Andy.Chen  
          11.  *  
          12.  */  
          13. public class AbstractFactoryClient {  
          14.   
          15.     public static void main(String[] args) {  
          16.           
          17.         System.out.println("Welcome to Andy.Chen Blog!" +"\n"   
          18.                    +"Abstract Factory Patterns." +"\n"  
          19.                    +"-------------------------------");  
          20.           
          21.         IUser oracleUser,sqlUser;  
          22.         IDepartment oracleDept,sqlDept;  
          23.         OracleFactory of = new OracleFactory();  
          24.         SQLServerFactory sf = new SQLServerFactory();  
          25.           
          26.         oracleUser = of.createUser();  
          27.         oracleDept = of.createDepartment();  
          28.         sqlUser = sf.createUser();  
          29.         sqlDept = sf.createDepartment();  
          30.     }  
          31. }  
          【4】程序運行結果:

           

          1. Welcome to Andy.Chen Blog!  
          2. Abstract Factory Patterns.  
          3. -------------------------------  
          4. Oracle工廠:在Oracle中操作User表.  
          5. Oracle工廠:在Oracle中操作Department表.  
          6. SQL Server工廠:在SQL Server中操作User表.  
          7. SQL Server工廠:在SQL Server中操作Department表.  
          【5】總結

           

          抽象工廠模式優點:

          第一,易于交換產品系列,由于具體工廠類,例如IDBFactory factory = new OracleFactory(),在一個應用中只需要在初始化的時候出現一次,這就使得改變一個應用的具體工廠變得非常容易,它之需要改變具體工廠即可使用不同的產品配置。
          第二,它讓具體的創建實例與客戶端分離,客戶端是通過它們的抽象接口操縱實例,產品的具體類名也被具體工廠的實現分離,不會出現在客戶端代碼中。



          http://blog.csdn.net/cjjky/article/details/7346893

          posted on 2012-03-15 11:08 abin 閱讀(861) 評論(0)  編輯  收藏 所屬分類: PatternDesigns
          主站蜘蛛池模板: 略阳县| 贵州省| 林西县| 潮安县| 清徐县| 浑源县| 鞍山市| 怀远县| 宣恩县| 芜湖县| 阿鲁科尔沁旗| 股票| 军事| 上饶市| 长泰县| 长治市| 荥阳市| 大名县| 宁远县| 曲水县| 新巴尔虎右旗| 茌平县| 轮台县| 禄劝| 延吉市| 措勤县| 五大连池市| 苍梧县| 南木林县| 双城市| 扎兰屯市| 海丰县| 天等县| 旬邑县| 自贡市| 德昌县| 句容市| 库尔勒市| 梁河县| 钟祥市| 福鼎市|