工厂模式为什么要用 Factory 和 Product 两个接口。 如果不用的,每一个产品对应每一个工厂,看似也是可行的。
但对客户 client 来说, 就要对每一个product 和 factory 对写一个 client, 因为输出形参和输入形参不同。
所以,这里写两个父类,就只用写一个 client 即可达到目的。
关于工厂模式可以先看看这篇文章: http://blog.csdn.net/wuzhekai1985/article/details/6660462
以下转载自: http://www.cppblog.com/playerken/archive/2009/06/07/86970.html
产品抽象类声明产品接口,每个具体产品子类重写该接口。
工厂抽象类声明一个工厂方法,针对每个产品的具体工厂类重写该方法,在该工厂方法中创建对应的具体产品。
这样,用户可以使用工厂基类指针调用工厂方法,创建产品,对产品进行操作。
当产品增加时,只需要增加对应的工厂子类,用户针对产品操作的代码保持不变。而且用户并不需要知道它所操作的产品具体是什么。
#include
<
iostream
>
using namespace std;
// 产品抽象类
class Product
{
public :
virtual ~ Product(){}
// 提供一个接口
virtual void TestProduct() = 0 ;
};
// 具体产品子类
class Pen: public Product
{
public :
// 重写接口
virtual void TestProduct()
{
cout << " Pen " << endl;
}
};
// 具体产品子类
class Box: public Product
{
public :
// 重写接口
virtual void TestProduct()
{
cout << " Box " << endl;
}
};
// 工厂抽象类
class Factory
{
public :
virtual ~ Factory(){}
// 公有接口,调用工厂方法创建Product
Product * Create()
{
return FactoryMethod();
}
// 销毁Product
void Destroy(Product * p)
{
delete p;
}
protected :
// 声明工厂方法
virtual Product * FactoryMethod() = 0 ;
};
// 具体工厂
class PenFactory: public Factory
{
protected :
// 重写工厂方法,创建具体产品
Product * FactoryMethod()
{
return new Pen();
}
};
// 具体工厂
class BoxFactory: public Factory
{
protected :
// 重写工厂方法,创建具体产品
Product * FactoryMethod()
{
return new Box();
}
};
// 用户代码,传入工厂
// 根据需要创建产品,对产品进行操作
void ClinetTest(Factory * p)
{
Product * pp = p -> Create();
pp -> TestProduct();
p -> Destroy(pp);
}
int main()
{
// 创建具体工厂
Factory * pf = new PenFactory;
Factory * bf = new BoxFactory;
// 将工厂送给用户
ClinetTest(pf);
ClinetTest(bf);
delete pf;
delete bf;
return 0 ;
}
using namespace std;
// 产品抽象类
class Product
{
public :
virtual ~ Product(){}
// 提供一个接口
virtual void TestProduct() = 0 ;
};
// 具体产品子类
class Pen: public Product
{
public :
// 重写接口
virtual void TestProduct()
{
cout << " Pen " << endl;
}
};
// 具体产品子类
class Box: public Product
{
public :
// 重写接口
virtual void TestProduct()
{
cout << " Box " << endl;
}
};
// 工厂抽象类
class Factory
{
public :
virtual ~ Factory(){}
// 公有接口,调用工厂方法创建Product
Product * Create()
{
return FactoryMethod();
}
// 销毁Product
void Destroy(Product * p)
{
delete p;
}
protected :
// 声明工厂方法
virtual Product * FactoryMethod() = 0 ;
};
// 具体工厂
class PenFactory: public Factory
{
protected :
// 重写工厂方法,创建具体产品
Product * FactoryMethod()
{
return new Pen();
}
};
// 具体工厂
class BoxFactory: public Factory
{
protected :
// 重写工厂方法,创建具体产品
Product * FactoryMethod()
{
return new Box();
}
};
// 用户代码,传入工厂
// 根据需要创建产品,对产品进行操作
void ClinetTest(Factory * p)
{
Product * pp = p -> Create();
pp -> TestProduct();
p -> Destroy(pp);
}
int main()
{
// 创建具体工厂
Factory * pf = new PenFactory;
Factory * bf = new BoxFactory;
// 将工厂送给用户
ClinetTest(pf);
ClinetTest(bf);
delete pf;
delete bf;
return 0 ;
}