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