你的Creator
类是工厂。我们称之为ProductFactory
,以使示例更加明确。
(我假设你正在使用C++)
class Book : public Product
{
};
class Computer : public Product
{
};
class ProductFactory
{
public:
virtual Product* Make(int type)
{
switch (type)
{
case 0:
return new Book();
case 1:
return new Computer();
[...]
}
}
}
这样调用:
ProductFactory factory = ....;
Product* p1 = factory.Make(0);
Product* p2 = factory.Make(1);
因此,回答您的问题:
这与子类有什么关系?我应该使用子类来做什么?
工厂模式的定义是,工厂为创建一种特定类型的实例(通常是一个接口或抽象类)定义了一个公共API,但是返回的实现的真正类型(因此是子类引用)是工厂的责任。在这个例子中,工厂返回 Product
实例,其中 Book
和 Computer
是有效的子类。
还有其他的工厂惯用语,例如具有工厂的API和工厂的具体实现不像我的示例那样接受 type
,但它们与返回的实例的类型耦合,如下所示:
class ProductFactory
{
public:
virtual Product* Make() = 0;
}
class BookProductFactory : public ProductFactory
{
public:
virtual Product* Make()
{
return new Book();
}
}
在这个类中,
BookProductFactory
总是返回
Book
实例。
ProductFactory* factory = new BookProductFactory();
Product* p1 = factory->Make(); // p1 is a Book
delete p1;
delete factory;
为了澄清事情,由于似乎在
抽象工厂
和
工厂方法
设计模式之间存在一些混淆,让我们来看一个具体的例子:
使用抽象工厂
class ProductFactory {
protected:
virtual Product* MakeBook() = 0;
virtual Product* MakeComputer() = 0;
}
class Store {
public:
Gift* MakeGift(ProductFactory* factory) {
Product* p1 = factory->MakeBook();
Product* p2 = factory->MakeComputer();
return new Gift(p1, p2);
}
}
class StoreProductFactory : public ProductFactory {
protected:
virtual Product* MakeBook() { return new Book(); }
virtual Product* MakeComputer() { return new Computer(); }
}
class FreeBooksStoreProductFactory : public StoreProductFactory {
protected:
virtual Product* MakeBook() {
Book* b = new FreeBook();
return b;
}
}
这是这样使用的:
Store store;
ProductFactory* factory = new FreeBooksStoreProductFactory();
Gift* gift = factory->MakeGift(factory);
// gift has a FreeBook (Book with price 0) and a Computer
delete gift;
delete factory;
使用工厂方法
class Store {
public:
Gift* MakeGift() {
Product* p1 = MakeBook();
Product* p2 = MakeComputer();
return new Gift(p1, p2);
}
protected:
virtual Product* MakeBook() {
return new Book();
}
virtual Product* MakeComputer() {
return new Computer();
}
}
class FreeBooksStore : public Store {
protected:
virtual Product* MakeBook() {
Book* b = new FreeBook();
return b;
}
}
它的使用方法如下:
Store* store = new FreeBooksStore();
Gift* gift = store->MakeGift();
// gift has a FreeBook (Book with price 0) and a Computer
delete gift;
delete store;
当你使用像我在原始示例中使用的type
鉴别器时,我们正在使用参数化工厂方法
——一种知道如何创建不同类型对象的方法。但这可能会出现在抽象工厂
或工厂方法
模式中。一个简短的技巧:如果你扩展了工厂类,那么你正在使用抽象工厂。如果你扩展了带有创建方法的类,则表示你正在使用工厂方法。