<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 模式將問題(根據職責)分解為:
    1.誰在使用我們的特定對象(Client)
    2.誰來決定使用哪些對象(AbstractFactory)

    類圖(非標準類圖,為了給結合例子,稍稍修改):

    代碼如下:

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

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

     

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

    抽象工廠:

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

        AbstractProductA createProductA();

        
    /**
         *  Creates abstract product
         
    */

        AbstractProductB createProductB();
    }

    抽象產品A:

    public class AbstractProductA
    {
    }
    抽象產品B:
    public class AbstractProductB
    {
    }

    生產1產品的工廠:

    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;
        }

    }

    生產2產品的工廠:

    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;
        }

    }

    具體產品A1:

    public class ConcreteProductA1 extends AbstractProductA {

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

    }

     

    具體產品B1:

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

    }

     

    具體產品A2:

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

    }

     

    具體產品B2:

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

    }

     

    測試Client:

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

        
    private AbstractFactory abstractFactory;//衣服生產商
        /**
         * 
    @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生產商
            abstractFactory  = new ConcreteFactory1("nike生產商");
            
    //買一件西褲(nike)
            abstractProductB = abstractFactory.createProductB();//生產西褲
            
            
    //找到addi生產商
            abstractFactory  = new ConcreteFactory2("addi生產商");//生產襯衫
            
    //買一件襯衫(addi)
            abstractProductA=abstractFactory.createProductA();//生成襯衫
            
            abstractFactory 
    = null;
        }

    }

     

    結果輸出:

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

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

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

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


    網站導航:
     
    主站蜘蛛池模板: 全亚洲最新黄色特级网站| 久久精品免费一区二区喷潮| 亚洲国产高清精品线久久| 亚洲同性男gay网站在线观看| 久久成人免费大片| 亚洲av无码片在线播放| 日本免费污片中国特一级| 亚洲韩国—中文字幕| 国产精品免费大片| 亚洲精品在线电影| 成人无码区免费A片视频WWW| 色偷偷亚洲女人天堂观看欧| 免费看国产成年无码AV片| 亚洲精品中文字幕无码A片老| 日韩a级毛片免费视频| 免费大片黄在线观看| 亚洲中文字幕无码久久2017| 国内精品久久久久影院免费| 久久夜色精品国产噜噜噜亚洲AV| 91嫩草免费国产永久入口| 亚洲性色AV日韩在线观看| 人人狠狠综合久久亚洲高清| 国产免费阿v精品视频网址| 777亚洲精品乱码久久久久久| 野花高清在线电影观看免费视频 | 亚洲国产成人久久| 天天天欲色欲色WWW免费| 国产精品手机在线亚洲| 亚洲一区二区三区无码中文字幕| 免费成人在线视频观看| 亚洲制服丝袜第一页| 亚洲成a人片在线观看久| 日韩免费人妻AV无码专区蜜桃 | 日批日出水久久亚洲精品tv| 91免费在线视频| 日本亚洲精品色婷婷在线影院| 国产色爽女小说免费看| 日韩精品无码免费专区午夜| 亚洲三级高清免费| 亚洲精品老司机在线观看| 日韩在线永久免费播放|