<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>


    隨筆-35  評論-97  文章-0  trackbacks-0

    Abstract Factory 模式的意圖:

    需要為特定的客戶(或者對某種情況)提供對象組
    Abstract Factory 模式將問題(根據(jù)職責(zé))分解為:
    1.誰在使用我們的特定對象(Client)
    2.誰來決定使用哪些對象(AbstractFactory)

    類圖(非標(biāo)準(zhǔn)類圖,為了給結(jié)合例子,稍稍修改):

    代碼如下:

    在例子中,線索是這樣的。比如你要買一件襯衫(addi的)和一條西庫(nike的),牌子有nike的,還有addi的。約定對應(yīng)關(guān)系如下:

    AbstractFactory   ---  衣服生產(chǎn)商
    AbstractProductB  ---  西褲
    AbstractProductA  ---  襯衫
    ConcreteFactory1  --    nike生產(chǎn)商
    ConcreteFactory2  --    addi生產(chǎn)商
    ConcreteProductA1 --    ××的襯衫
    ConcreteProductB1 --    ××的褲子
    (在這里ConcreteProductA1、ConcreteProductB1為ConcreteFactory1的產(chǎn)品)
    ConcreteProductA2 --    ××的襯衫
    ConcreteProductB2 --    ××的褲子
    (在這里ConcreteProductA2、ConcreteProductB2為ConcreteFactory2的產(chǎn)品)

     

    這里沒有對類進行具體細化的命名,只作簡單的約定,你可以根據(jù)需要修改名稱。

    抽象工廠:

    public interface AbstractFactory {
        
    /**
         *  Creates abstract product
         
    */

        AbstractProductA createProductA();

        
    /**
         *  Creates abstract product
         
    */

        AbstractProductB createProductB();
    }

    抽象產(chǎn)品A:

    public class AbstractProductA
    {
    }
    抽象產(chǎn)品B:
    public class AbstractProductB
    {
    }

    生產(chǎn)1產(chǎn)品的工廠:

    public class ConcreteFactory1 implements AbstractFactory {

    private  String name;

        
    public ConcreteProductA1 createProductA() {
            
    return new ConcreteProductA1(name);
        }

        
        
    public ConcreteProductB1 createProductB() {
            
    return new ConcreteProductB1(name);
        }


        
    public ConcreteFactory1(String name)
        
    {
            
    super();
            
    this.name = name;
        }

    }

    生產(chǎn)2產(chǎn)品的工廠:

    public class ConcreteFactory2 implements AbstractFactory
    {
        
    private  String name;

        
    public ConcreteProductA2 createProductA()
        
    {
            
    return new ConcreteProductA2(name);
        }


        
    public ConcreteProductB2 createProductB()
        
    {
            
    return new ConcreteProductB2(name);
        }


        
    public ConcreteFactory2(String name)
        
    {
            
    super();
            
    this.name = name;
        }

    }

    具體產(chǎn)品A1:

    public class ConcreteProductA1 extends AbstractProductA {

        
    public ConcreteProductA1(String name)
        
    {
            System.out.println(name
    + "的襯衫");
        }

    }

     

    具體產(chǎn)品B1:

    public class ConcreteProductB1 extends AbstractProductB
    {
        
    public ConcreteProductB1(String name)
        
    {
            System.out.println(name
    + "的褲子");
        }

    }

     

    具體產(chǎn)品A2:

    public class ConcreteProductA2 extends AbstractProductA
    {
        
    public ConcreteProductA2(String name)
        
    {
            System.out.println(name
    + "的襯衫");
        }

    }

     

    具體產(chǎn)品B2:

    public class ConcreteProductB2 extends AbstractProductB
    {
        
    public ConcreteProductB2(String name)
        
    {
            System.out.println(name
    + "的褲子");
        }

    }

     

    測試Client:

    public class Client
    {
        
    /**
         * @directed true
         
    */

        
    private AbstractFactory abstractFactory;//衣服生產(chǎn)商
        /**
         * 
    @link aggregation
         
    */

        
    private AbstractProductB abstractProductB;//西褲
        /**
         * 
    @link aggregation
         
    */

        
    private AbstractProductA abstractProductA;//襯衫
        
        
    public static void main(String[] args)
        
    {
            Client client 
    = new Client();
            client.buySomething();
        }

        
        
    public void buySomething(){
            
    //找到nike生產(chǎn)商
            abstractFactory  = new ConcreteFactory1("nike生產(chǎn)商");
            
    //買一件西褲(nike)
            abstractProductB = abstractFactory.createProductB();//生產(chǎn)西褲
            
            
    //找到addi生產(chǎn)商
            abstractFactory  = new ConcreteFactory2("addi生產(chǎn)商");//生產(chǎn)襯衫
            
    //買一件襯衫(addi)
            abstractProductA=abstractFactory.createProductA();//生成襯衫
            
            abstractFactory 
    = null;
        }

    }

     

    結(jié)果輸出:

    nike生產(chǎn)商的褲子
    addi生產(chǎn)商的襯衫
    posted on 2007-06-05 18:45 三告習(xí)習(xí) 閱讀(1713) 評論(3)  編輯  收藏 所屬分類: DesignPattern

    評論:
    # re: [設(shè)計模式篇] Abstract Factory 模式讀書筆記與舉例 2007-06-05 19:20 | 劉甘泉
    又是設(shè)計模式,其實也就那么一回事,知道大概的模式的概念就好
    在編程的時候不要刻意的去迎合模式,要去迎合抽象就可以了  回復(fù)  更多評論
      
    # re: [設(shè)計模式篇] Abstract Factory 模式讀書筆記與舉例 2007-06-06 16:59 | pass86
    /** *//**
    * Creates abstract product
    */
    AbstractProductA createProductA();

    /** *//**
    * Creates abstract product
    */
    AbstractProductB createProductB();
    這兩個接口應(yīng)該保持不變吧,返回值也一樣,
    ConcreteFactory1
    ConcreteFactory2
    中返回值是它們的之類,用java-1.4.0-gcj-1.4.2.0編譯不成功,必須繼承的接口也要寫成返回AbstractProductA或者AbstractProductB。  回復(fù)  更多評論
      
    # re: [設(shè)計模式篇] Abstract Factory 模式讀書筆記與舉例 2008-02-03 18:02 |
    抽象工廠好象還是偶合了一些東西吧?
    我覺得不太靈活  回復(fù)  更多評論
      

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲VA中文字幕无码一二三区 | 亚洲熟妇无码八AV在线播放| 成年女人免费v片| 4455永久在线观免费看| 免费A级毛片av无码| 亚洲视频在线免费观看| 日本免费中文字幕| 99久久人妻精品免费一区| 无码日韩精品一区二区免费暖暖| 久热免费在线视频| 91精品国产免费| 1000部无遮挡拍拍拍免费视频观看| 无码人妻久久一区二区三区免费| 99热在线精品免费播放6| 84pao强力永久免费高清| 四虎成年永久免费网站| 在线观看的免费网站| 国产精品美女午夜爽爽爽免费| 午夜高清免费在线观看| 国产精品深夜福利免费观看| 国产小视频免费观看| 亚洲欧洲久久av| 亚洲成色www久久网站夜月| 亚洲视频在线视频| 精品亚洲国产成人| 亚洲AV无码男人的天堂| 午夜在线免费视频 | 国产99在线|亚洲| 亚洲hairy多毛pics大全| 四虎国产精品成人免费久久| 拍拍拍无挡视频免费观看1000| 午夜网站在线观看免费完整高清观看| 99re免费视频| 在线免费观看一级毛片| 亚洲精品线路一在线观看| 亚洲AV无码一区二区二三区软件| 亚洲精品国产福利片| 亚洲AV女人18毛片水真多| 国产精品玖玖美女张开腿让男人桶爽免费看| 99久久国产精品免费一区二区| h视频在线免费看|