我的在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類聲明的接口
七、 效果
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的接口以及全部與它相關的類。
九、 代碼示例
AbstractFactorypackage com.examples.pattern.abstractFactory; /** * 封裝抽象工廠的接口,聲明建立抽象產品對象的操做 */ public interface AbstractFactory { /** * 建立抽象產品A的對象 * @return 抽象產品A的對象 */ public AbstractProductA createProductA(); /** * 建立抽象產品B的對象 * @return 抽象產品B的對象 */ public AbstractProductB createProductB(); }
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(); } }
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(); }
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的操做......"); } }
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(); } }