| 網(wǎng)站首頁 | 關(guān)于我們 | 開發(fā)優(yōu)勢(shì) | 產(chǎn)品展示 |
| 合作企業(yè) | 新聞動(dòng)態(tài) | 聯(lián)系我們 | 電話聯(lián)系 |
文章作者:濟(jì)南軟件開發(fā) 時(shí)間:2016年12月20日
工廠方法模式
定義:定義一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類決定實(shí)例化哪個(gè)類。工廠方法使一個(gè)類的實(shí)例化延遲到其子類。
適用性:
1、 當(dāng)一個(gè)類不知道它所必須創(chuàng)建的對(duì)象的類的時(shí)候
2、 當(dāng)一個(gè)類希望由它的子類來指定它所創(chuàng)建的對(duì)象的時(shí)候
3、 當(dāng)類將創(chuàng)建對(duì)象的職責(zé)委托給多個(gè)幫助子類中的一個(gè),并且你希望將哪一個(gè)幫助子類是代理者這一信息局部化的時(shí)候
優(yōu)點(diǎn):
1、 良好的封裝性
2、 良好的擴(kuò)展性
3、 屏蔽了產(chǎn)品類,用戶不需要知道產(chǎn)品類的實(shí)例化過程。
4、 實(shí)現(xiàn)解耦,符合迪米特法則
實(shí)現(xiàn):
class Product
{
public:
virtual void fun() = 0;
protected:
private:
};
class ConcreteProductA:public Product
{
public:
voidfun()
{
cout<<"ConcreteProductA"<<endl;< p="" style="margin: 0px; padding: 0px;">
}
protected:
private:
};
class ConcreteProductB:public Product
{
public:
voidfun()
{
cout<<"ConcreteProductB"<<endl;< p="" style="margin: 0px; padding: 0px;">
}
protected:
private:
};
class Creator
{
public:
virtualProduct *CreateProductMethod(int type) = 0;
protected:
private:
};
class ConcreteCreator:public Creator
{
public:
Product *CreateProductMethod(int type ) ;
protected:
private:
};
Product*ConcreteCreator::CreateProductMethod(int type)
{
switch(type)
{
case 0:
returnnew ConcreteProductA;
case 1:
returnnew ConcreteProductB;
default:
returnNULL;
}
}
如果不想創(chuàng)建Creator的子類,那么可以用模板類。
class Creator
{
public:
virtualProduct *CreateProductMethod() = 0;
protected:
private:
};
template
class TemplateCreator:public Creator
{
public:
Product *CreateProductMethod();
};
template
Product*TemplateCreator
{
return new T;
}
TemplateCreator
TemplateCreator
Product *pa = ACreator.CreateProductMethod();
Product *pb =BCreator.CreateProductMethod();
pa->fun();
pb->fun();
擴(kuò)展:
1、簡(jiǎn)單工廠方法;有時(shí)候我們并不需要把工廠類實(shí)例化。那么可以把Creator去掉,不要繼承,直接使用靜態(tài)方法。
class ConcreteCreator
{
public:
staticProduct *CreateProductMethod(int type ) ;
protected:
private:
};
Product*ConcreteCreator::CreateProductMethod(int type)
{
switch(type)
{
case 0:
returnnew ConcreteProductA;
case 1:
returnnew ConcreteProductB;
default:
returnNULL;
}
}
Product *pa =ConcreteCreator::CreateProductMethod(0);
Product *pb =ConcreteCreator::CreateProductMethod(1);
pa->fun();
pb->fun();
想要了解更多詳情歡迎來電咨詢18678812288
登陸網(wǎng)址:m.h6244.cn。
聯(lián)系人:王經(jīng)理。