<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 三告習習 閱讀(1722) 評論(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 |
    抽象工廠好象還是偶合了一些東西吧?
    我覺得不太靈活  回復  更多評論
      

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


    網站導航:
     
    主站蜘蛛池模板: 久久久久免费看成人影片| 国产在线观看免费视频播放器 | 成人A片产无码免费视频在线观看| 日韩亚洲人成在线| 久久久久亚洲AV成人无码网站| 免费永久看黄在线观看app| 97碰公开在线观看免费视频| 亚洲成av人片天堂网老年人| 中文字幕免费在线观看| 精品国产污污免费网站入口| 国产亚洲精品2021自在线| 亚洲大香人伊一本线| 亚洲第一福利视频| 亚洲码国产精品高潮在线| 伊人久久亚洲综合影院| 国产精品极品美女免费观看| 免费可以在线看A∨网站| 中国xxxxx高清免费看视频| 久久精品免费一区二区三区| 精品久久久久久无码免费| 无码精品人妻一区二区三区免费| 亚洲精品精华液一区二区 | 一个人免费视频观看在线www| 青娱乐在线免费观看视频| 成人精品国产亚洲欧洲| 成a人片亚洲日本久久| 亚洲人成色77777在线观看| 亚洲男人的天堂久久精品| 亚洲一区二区三区在线| 亚洲剧场午夜在线观看| 亚洲精品午夜视频| 亚洲国产精品无码久久久| 精品亚洲成AV人在线观看| 亚洲第一区视频在线观看| 亚洲成a人片77777群色| 亚洲一区二区三区亚瑟| 伊人久久五月丁香综合中文亚洲| 天天爽亚洲中文字幕| 亚洲成人激情小说| 亚洲狠狠婷婷综合久久蜜芽| 国产精品亚洲av色欲三区|