国产丰满大乳无码免费播放_久草一级毛片_国产av黄色一区二区_亚洲一级 片内射欧美乱强上司_制服丝袜亚洲日韩中文字幕欧美_亚洲av中文小島_国产精品无码久久av嫩草下载_91视频黄片软件APP大全

XML|HTML|TXT
您當前位置: 軟件開發>> 新利在線娛樂>> 軟件開發技術>> 瀏覽文章

工廠方法模式 C++實現

工廠方法模式

定義:定義一個用于創建對象的接口,讓子類決定實例化哪個類。工廠方法使一個類的實例化延遲到其子類。

適用性:

1、 當一個類不知道它所必須創建的對象的類的時候

2、 當一個類希望由它的子類來指定它所創建的對象的時候

3、 當類將創建對象的職責委托給多個幫助子類中的一個,并且你希望將哪一個幫助子類是代理者這一信息局部化的時候

優點:

1、 良好的封裝性

2、 良好的擴展性

3、 屏蔽了產品類,用戶不需要知道產品類的實例化過程。

4、 實現解耦,符合迪米特法則

實現:

class Product

{

public:

virtual void fun() = 0;

protected:

private:

};

class ConcreteProductA:public Product

{

public:

voidfun()

{

cout<<"ConcreteProductA"<

}

protected:

private:

};

class ConcreteProductB:public Product

{

public:

voidfun()

{

cout<<"ConcreteProductB"<

}

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;

}

}

如果不想創建Creator的子類,那么可以用模板類。

class Creator

{

public:

virtualProduct *CreateProductMethod() = 0;

protected:

private:

};

template

class TemplateCreator:public Creator

{

public:

Product *CreateProductMethod();

};

template

Product*TemplateCreator ::CreateProductMethod()

{

return new T;

}

TemplateCreator ACreator;

TemplateCreator BCreator;

Product *pa = ACreator.CreateProductMethod();

Product *pb =BCreator.CreateProductMethod();

pa->fun();

pb->fun();

擴展:

1、簡單工廠方法;有時候我們并不需要把工廠類實例化。那么可以把Creator去掉,不要繼承,直接使用靜態方法。

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 E-Mail:1069706080@qq.com
地址:山東省濟南市舜耕路泉城公園東門園內向北50米 魯ICP備07011972號 版權所有2008-2013 新利體育18
Baidu