- 抽象工廠模式是圍繞一個超級工廠創(chuàng)建其他工廠拓春。該超級工廠是其他工廠的工廠
- 在抽象工廠模式中释簿,接口是負(fù)責(zé)創(chuàng)建一個相關(guān)對象的工廠,不需要顯示指定他們的類硼莽,每個工廠都能按照工廠模式提供對象庶溶。
主要解決的問題:解決接口選擇的問題
使用的時機:系統(tǒng)的產(chǎn)品有用于一個的產(chǎn)品族,而系統(tǒng)只消費其中的某一組產(chǎn)品
解決方法:在一個產(chǎn)品族里定義多個產(chǎn)品
關(guān)鍵代碼:在一個工廠里聚合多個同類產(chǎn)品
-
優(yōu)點:
1懂鸵、當(dāng)一個產(chǎn)品族中的多個對象被設(shè)計成一起工作時偏螺,它能保證客戶端始終只使用同一個產(chǎn)品族中的對象; -
缺點:
1匆光、產(chǎn)品族擴(kuò)展非常困難套像,要增加一個系列的某一個產(chǎn)品,既要在抽象的Creator里加代碼终息,又要在具體的類里面加代碼
2夺巩、產(chǎn)品族擴(kuò)展困難,產(chǎn)品等級擴(kuò)展容易
抽象工廠類圖.PNG -
實例:
舉個例子周崭,我們要生產(chǎn)一把尺子柳譬,尺子有形狀和顏色兩個屬性,尺子的形狀和顏色分別需要兩個工廠完分別完成定形(形狀)和涂色(顏色)续镇,其中形狀又分為多種 :矩形美澳、圓形等,顏色分為綠色、藍(lán)色等人柿,一把尺子只有只有一種形狀和顏色柴墩。在這種情況下生產(chǎn)一把尺子的代碼實現(xiàn)如下忙厌,原理框圖如上圖所示凫岖。 - 代碼實現(xiàn):
#include <iostream>
using namespace std;
enum ShapeType
{
RECTANGLE,
CIRCLE
};
enum ColorType
{
GREEN,
BLUE
};
enum Type
{
SHAPE,
COLOR
};
//定義一個形狀類
class Shape
{
public:
virtual void draw() = 0; //純虛方法
};
//定義一個矩形
class Rectangle:public Shape
{
public:
Rectangle()
{
cout<<"Rectangle---創(chuàng)建矩形對象"<<endl;
}
virtual void draw()
{
cout<<"Rectangle::draw Rectangle"<<endl;
}
};
//定義一個圓形
class Circle:public Shape
{
public:
Circle()
{
cout << "Circle---創(chuàng)建圓形對象" << endl;
}
virtual void draw()
{
cout << "Circle::draw Circle" << endl;
}
};
//定義一個顏色類
class Color
{
public:
virtual void fill() = 0; //純虛方法
};
//定義一個綠色
class Green:public Color
{
public:
Green()
{
cout<<"Green---創(chuàng)建綠色對象"<<endl;
}
virtual void fill()
{
cout<<"Green::fill Green"<<endl;
}
};
//定義一個藍(lán)色
class Blue:public Color
{
public:
Blue()
{
cout<<"Blue---創(chuàng)建藍(lán)色對象藍(lán)色"<<endl;
}
virtual void fill()
{
cout<<"Blue::fill Blue";
}
};
//定義一個抽象工廠
class AbsractFactory
{
public:
virtual Color* getColor(ColorType type) =0; //純虛函數(shù)
virtual Shape* getShape(ShapeType type) =0; //純虛函數(shù)
};
/* 注意:派生類必須實現(xiàn)基類的所有純虛函數(shù),
* 負(fù)責(zé)派生類也就有了純虛函數(shù)逢净,派生類也就成了抽象類哥放,不能被實例化
*/
//定義一個形狀工廠
class ShapeFactory: public AbsractFactory
{
public:
virtual Shape* getShape(ShapeType type)
{
switch(type)
{
case RECTANGLE:
return (new Rectangle());
break;
case CIRCLE:
return (new Circle());
break;
default:
return NULL;
break;
}
}
virtual Color* getColor(ColorType type)
{
return NULL;
}
};
//定義一個色彩填充工廠
class ColorFactory:public AbsractFactory
{
public:
virtual Color* getColor(ColorType type)
{
switch(type)
{
case GREEN:
return (new Green());
break;
case BLUE:
return (new Blue());
break;
default:
return NULL;
break;
}
}
virtual Shape* getShape(ShapeType type)
{
return NULL;
}
};
//定義一個工廠生產(chǎn)者
class FactoryProducer
{
public:
FactoryProducer()
{
cout<<"創(chuàng)建一個工廠"<<endl;
}
static AbsractFactory* getFactory(Type type)
{
switch(type)
{
case SHAPE:
return (new ShapeFactory());
break;
case COLOR:
return (new ColorFactory());
break;
default:
return NULL;
break;
}
}
};
/* 注意:派生類必須實現(xiàn)基類的所有純虛函數(shù),
* 負(fù)責(zé)派生類也就有了純虛函數(shù)爹土,派生類也就成了抽象類甥雕,不能被實例化
*/
int main()
{
// 1、創(chuàng)建一把形狀為圓形的尺子
/* 1.1胀茵、獲取形狀工廠 */
AbsractFactory *pShapeFactory = FactoryProducer::getFactory(SHAPE);
/* 1.2社露、獲得一個形狀為圓形的對象 */
Shape *pShape = pShapeFactory->getShape(CIRCLE);
/* 1.3、調(diào)用圓形對象的畫筆畫圓形形狀 */
pShape->draw();
// 2琼娘、為尺子填充顏色:綠色
/* 2.1峭弟、獲取顏色工廠 */
AbsractFactory *pColorFactory = FactoryProducer::getFactory(COLOR);
/* 2.2、獲得一個綠色對象 */
Color *pColor = pColorFactory->getColor(GREEN);
/* 2.3脱拼、調(diào)用綠色對象的染色桶填充顏色:綠色 */
pColor->fill();
// 1瞒瘸、創(chuàng)建一把形狀為矩形的尺子
/* 1.1、獲取形狀工廠 */
pShapeFactory = FactoryProducer::getFactory(SHAPE);
/* 1.2熄浓、獲得一個形狀為矩形的對象 */
pShape = pShapeFactory->getShape(RECTANGLE);
/* 1.3情臭、調(diào)用矩形對象的畫筆畫矩形形狀 */
pShape->draw();
// 2、為尺子填充顏色:藍(lán)色
/* 2.1赌蔑、獲取顏色工廠 */
pColorFactory = FactoryProducer::getFactory(COLOR);
/* 2.2俯在、獲得一個藍(lán)色對象 */
pColor = pColorFactory->getColor(BLUE);
/* 2.3、調(diào)用藍(lán)色對象的染色桶填充顏色:藍(lán)色 */
pColor->fill();
}
//////////////////////////運行結(jié)果////////////////////////////////////////
Circle---創(chuàng)建圓形對象
Circle::draw Circle
Green---創(chuàng)建綠色對象
Green::fill Green
Rectangle---創(chuàng)建矩形對象
Rectangle::draw Rectangle
Blue---創(chuàng)建藍(lán)色對象藍(lán)色
Blue::fill Blue