設計模式——抽象工廠

我的在CSDN的BLOG:http://blog.csdn.net/feb13/article/details/7833473java

如下是讀《設計模式——可複用面向對象軟件的基礎》的讀書筆記。設計模式

ABSTRACT FACTORY抽象工廠ide

 

一、 意圖編碼

提供一個建立一系列相關或相互依賴對象的接口,而無需指定它們具體的類。.net

二、 別名設計

Kitcode

三、 適用性對象

在如下狀況可使用Abstract Factory模式blog

  • 一個系統要獨立於它的產品的建立、組合和表示時
  •  一個系統要由多個產品系列中的一個來配置時
  • 當你要強調一系列相關的產品對象的設計以便進行聯合使用時
  • 當你提供一個產品類庫,而只想顯示她們的接口而不是實現時

四、 結構接口

此模式的結構圖以下:

五、 參與者

AbstractFactory    聲明一個建立抽象產品對象的操做接口


ConcreteFactory    實現建立具體產品對象的操做


AbstractProduct    爲一類產品對象聲明一個接口


ConcreteProduct    定義一個將被相應的具體工廠建立的產品對象;實現AbstractFactory接口


Client    僅使用由AbstractFactory和AbstractProduct類聲明的接口



六、 協做
  •  一般在運行時刻建立一個ConcreteFactory類的實例。這一具體的工廠建立具備特定實現的產品對象。爲建立不一樣的產品對象,客戶端應使用不一樣的具體工廠。
  •  AbstractFactory將產品對象的建立延遲到它的ConcreteFactory子類。

七、 效果

Abstract Factory模式有下面的一些有點和缺點:

1)  它分離了具體的類        
              Abstract Factory模式幫助你控制一個應用建立的對象的類。由於一個工廠封裝建立產品對象的責任和過程,它將客戶與類的實現分離。客戶經過它們的抽象接口操縱 實例。產品的類名也在具體工廠的實現中被分離;它們不出如今客戶代碼中。

2)  它使得易於交換產品系列     
             一個具體工廠類在一個應用中僅出現一次——即在它初始化的時候。這使得改變一個應用的具體工廠變得容易。它只需改變具體的工廠便可使用不一樣的產品配置,這是由於一個抽象工廠建立了一個完整的產品系列,因此整個產品系列會馬上改變。

3)  它有利於產品的一致性    
             當一系列中的產品對象被設計成一塊兒工做時,一個應用一次只能使用同一個系列中的對象,這一點很重要。而AbstractFactory很容易實現這一點。

4)  難以支持新種類的產品    
            難以擴展抽象工廠以生產新種類的產品。這是由於AbstractFactory接口肯定了能夠被建立的產品集合。支持新種類的產品就須要擴展該工廠接口,這將涉及AbstractFactory類及其全部子類的改變。

八、 實現

下面是實現Abstract Factory模式的一些技術

1)將工廠做爲單件       
             一個應用中通常每一個產品系列只需一個ConcreteFactory的實例。所以工廠一般最好實現爲一個singleton。

2)建立產品            
          AbstractFactory僅聲明一個建立產品的接口,真正建立產品是由ConcreteProduct子類實現。最一般的一個方法是爲每一個產品定義 一個工廠方法(Factory Method)。一個具體的工廠將爲每一個產品重定義該工廠方法以指定產品。若是有多個可能的產品系列,具體工廠也可使用Prototype模式實現。具 體工廠使用產品系列中每個產品原型實例來初始化,且它經過複製它的原型來建立新的產品在基於原型的方法中,使得不是每一個新的產品系列都須要一個新的具體 工廠類。

3)定義可擴展的工廠            
           AbstractFactory一般爲每一種它能夠生產的產品定義一個操做。產品的種類被編碼在操做型構中。增長一種新的產品要求改變AbstractFactory的接口以及全部與它相關的類。

九、 代碼示例

AbstractFactory
package com.examples.pattern.abstractFactory;

/**   
* 封裝抽象工廠的接口,聲明建立抽象產品對象的操做 
*/
public interface AbstractFactory {
    
    /**
     * 建立抽象產品A的對象
     * @return 抽象產品A的對象
     */
    public AbstractProductA createProductA();
    /**
     * 建立抽象產品B的對象
     * @return 抽象產品B的對象
     */
    public AbstractProductB createProductB();

}


ConcreteFactory
package com.examples.pattern.abstractFactory;

/**   
* 具體工廠的實現對象,實現建立具體的產品對象的操做   
*/
public class ConcreteFactory1 implements AbstractFactory {

    @Override
    public AbstractProductA createProductA() {
        return new ProductA1();
    }

    @Override
    public AbstractProductB createProductB() {
        return new ProductB1();
    }

}
package com.examples.pattern.abstractFactory;

/**
 * 具體工廠的實現對象,實現建立具體的產品對象的操做
 */
public class ConcreteFactory2 implements AbstractFactory {

    @Override
    public AbstractProductA createProductA() {
        return new ProductA2();
    }

    @Override
    public AbstractProductB createProductB() {
        return new ProductB2();
    }

}



AbstractProduct
package com.examples.pattern.abstractFactory;

/**
 * 抽象產品A的接口
 */
public interface AbstractProductA {

    /**
     * 定義產品A的相關操做
     */
    public void operate();

}


package com.examples.pattern.abstractFactory;

/**
 * 抽象產品B的接口
 */
public interface AbstractProductB {
    
    /**
     * 定義產品A的相關操做
     */
    public void operate();

}



ConcreteProduct
package com.examples.pattern.abstractFactory;

/**
 * 產品A的具體實現
 */
public class ProductA1 implements AbstractProductA {

    @Override
    public void operate() {
        System.out.println("這是產品A1的操做......");
    }

}
package com.examples.pattern.abstractFactory;

/**
 * 產品A的具體實現
 */
public class ProductA2 implements AbstractProductA {

    @Override
    public void operate() {
        System.out.println("這是產品A2的操做......");
    }

}


package com.examples.pattern.abstractFactory;

/**
 * 產品B的具體實現
 */
public class ProductB1 implements AbstractProductB {

    @Override
    public void operate() {
        System.out.println("這是產品B1的操做......");
    }

}
package com.examples.pattern.abstractFactory;

/**   
* 產品B的具體實現
*/
public class ProductB2 implements AbstractProductB {

    @Override
    public void operate() {
        System.out.println("這是產品B2的操做......");
    }

}

Client
package com.examples.pattern.abstractFactory;

public class Client {
    
    public static void main(String[] args) {
        AbstractFactory factory = null;
        AbstractProductA apa = null;
        AbstractProductB apb = null;
        
        factory = new ConcreteFactory1();
        apa = factory.createProductA();
        apb = factory.createProductB();
        apa.operate();
        apb.operate();
        
        
        factory = new ConcreteFactory2();
        apa = factory.createProductA();
        apb = factory.createProductB();
        apa.operate();
        apb.operate();
    }

}
相關文章
相關標籤/搜索