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"<<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;

}

}

 

如果不想创建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;

TemplateCreatorBCreator;

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 山东赢德信息科技有限公司