少年阿賓

          那些青春的歲月

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks
                   每個模式都是針對一定問題的解決方案。抽象工廠模式面對的問題是多產(chǎn)品等級結(jié)構(gòu)的系統(tǒng)設(shè)計。
                   在學習抽象工廠具體實例之前,應(yīng)該明白兩個重要的概念:產(chǎn)品族和產(chǎn)品等級。

                   產(chǎn)品族:是指位于不同產(chǎn)品等級結(jié)構(gòu)中,功能相關(guān)聯(lián)的產(chǎn)品組成的家族。比如AMD的CPU和ADM芯片的主板,組成一個家族。Intel的CPU和Intel芯片的主板,又組成一個家族。而這兩個家族都來自于兩個產(chǎn)品等級:CPU,主板。一個等級結(jié)構(gòu)是由相同的結(jié)構(gòu)的產(chǎn)品組成,示意圖如下:


           理解這個產(chǎn)品結(jié)構(gòu)是理解抽象工廠模式的關(guān)鍵所在,從上圖可以看出,抽象工廠模式的每個工廠創(chuàng)造出來的都是一族產(chǎn)品,而不是一個或者一組。組是可以隨意組合的!其實工廠方法模式和抽象工廠模式就這點點差別。

          【1】基本概念

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

          【2】簡單分析

          我們先看一下抽象工廠模式的UML結(jié)構(gòu)圖:

          上圖是 Abstract Factory 模式結(jié)構(gòu)圖,讓我們可以進行更加方便的描述:

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


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

          IUser.java的源碼:

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

           

          1. package com.andyidea.patterns.abstractproduct;  
          2.   
          3. /**  
          4.  * 抽象產(chǎn)品角色: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創(chuàng)建具體產(chǎn)品角色類: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.  * 具體產(chǎn)品角色: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.  * 具體產(chǎn)品角色: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.  * 具體產(chǎn)品角色: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.  * 具體產(chǎn)品角色: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 創(chuàng)建具體工廠類: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】程序運行結(jié)果:

           

          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】總結(jié)

           

          抽象工廠模式優(yōu)點:

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



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

          posted on 2012-03-15 11:08 abin 閱讀(860) 評論(0)  編輯  收藏 所屬分類: PatternDesigns
          主站蜘蛛池模板: 大渡口区| 清镇市| 洛川县| 无锡市| 姚安县| 鲁甸县| 灵宝市| 靖边县| 陕西省| 南宁市| 香河县| 织金县| 道真| 天台县| 项城市| 丘北县| 甘德县| 吴忠市| 宣武区| 拜泉县| 四平市| 柳河县| 调兵山市| 临朐县| 分宜县| 原阳县| 南平市| 太白县| 彭泽县| 定边县| 定南县| 佛学| 醴陵市| 巨鹿县| 华容县| 碌曲县| 勃利县| 桑日县| 柏乡县| 方山县| 武城县|