目錄ios
目錄設計模式
在工廠方法模式中具體工廠負責生產具體的產品,每個具體工廠對應一種具體產品,工廠方法也具備惟一性,通常狀況下,一個具體工廠中只有一個工廠方法或者一組重載的工廠方法。可是有時候咱們須要一個工廠能夠提供多個產品對象,而不是單一的產品對象。spa
爲了更清晰地理解工廠方法模式,須要先引入兩個概念:設計
當系統所提供的工廠所需生產的具體產品並非一個簡單的對象,而是多個位於不一樣產品等級結構中屬於不一樣類型的具體產品時須要使用抽象工廠模式。code
抽象工廠模式是全部形式的工廠模式中最爲抽象和最具通常性的一種形態。對象
抽象工廠模式與工廠方法模式最大的區別在於,工廠方法模式針對的是一個產品等級結構,而抽象工廠模式則須要面對多個產品等級結構,一個工廠等級結構能夠負責多個不一樣產品等級結構中的產品對象的建立 。當一個工廠等級結構能夠建立出分屬於不一樣產品等級結構的一個產品族中的全部對象時,抽象工廠模式比工廠方法模式更爲簡單、有效率。blog
抽象工廠模式(Abstract Factory Pattern):提供一個建立一系列相關或相互依賴對象的接口,而無須指定它們具體的類。抽象工廠模式又稱爲Kit模式,屬於對象建立型模式。繼承
抽象工廠模式包含以下角色:接口
#include <iostream> #include "AbstractFactory.h" #include "AbstractProductA.h" #include "AbstractProductB.h" #include "ConcreteFactory1.h" #include "ConcreteFactory2.h" using namespace std; int main(int argc, char *argv[]) { AbstractFactory * fc = new ConcreteFactory1(); AbstractProductA * pa = fc->createProductA(); AbstractProductB * pb = fc->createProductB(); pa->use(); pb->eat(); AbstractFactory * fc2 = new ConcreteFactory2(); AbstractProductA * pa2 = fc2->createProductA(); AbstractProductB * pb2 = fc2->createProductB(); pa2->use(); pb2->eat();
/////////////////////////////////////////////////////////// // ConcreteFactory1.cpp // Implementation of the Class ConcreteFactory1 // Created on: 02-十月-2014 15:04:11 // Original author: colin /////////////////////////////////////////////////////////// #include "ConcreteFactory1.h" #include "ProductA1.h" #include "ProductB1.h" AbstractProductA * ConcreteFactory1::createProductA(){ return new ProductA1(); } AbstractProductB * ConcreteFactory1::createProductB(){ return new ProductB1(); }
/////////////////////////////////////////////////////////// // ProductA1.cpp // Implementation of the Class ProductA1 // Created on: 02-十月-2014 15:04:17 // Original author: colin /////////////////////////////////////////////////////////// #include "ProductA1.h" #include <iostream> using namespace std; void ProductA1::use(){ cout << "use Product A1" << endl; }
運行結果:產品
在如下狀況下可使用抽象工廠模式:
在不少軟件系統中須要更換界面主題,要求界面中的按鈕、文本框、背景色等一塊兒發生改變時,可使用抽象工廠模式進行設計。
「開閉原則」要求系統對擴展開放,對修改封閉,經過擴展達到加強其功能的目的。對於涉及到多個產品族與多個產品等級結構的系統,其功能加強包括兩方面:
增長產品族:對於增長新的產品族,工廠方法模式很好的支持了「開閉原則」,對於新增長的產品族,只須要對應增長一個新的具體工廠便可,對已有代碼無須作任何修改。增長新的產品等級結構:對於增長新的產品等級結構,須要修改全部的工廠角色,包括抽象工廠類,在全部的工廠類中都須要增長生產新產品的方法,不能很好地支持「開閉原則」。
抽象工廠模式的這種性質稱爲「開閉原則」的傾斜性,抽象工廠模式以一種傾斜的方式支持增長新的產品,它爲新產品族的增長提供方便,但不能爲新的產品等級結構的增長提供這樣的方便。