您的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); // p1 is a Book*
Product* p2 = factory.Make(1); // p2 is a Computer*
// remember to delete p1 and p2
因此,要回答你的问题:
这是什么必须处理子类吗?我应该怎样使用 的子类?
工厂模式的定义是说工厂定义了一个通用的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;
为了明确这一点,因为似乎有点Abstract Factory
和Factory method
设计模式之间的混淆,让我们看一个具体的例子:
使用抽象工厂
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(); // a FreeBook is a Book with price 0
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(); // a FreeBook is a Book with price 0
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
鉴别,我们使用parametized factory methods
- 一种知道如何创建不同类型对象的方法。但是,这可以出现在Abstract Factory
或Factory Method
模式中。一个简单的诀窍:如果你正在扩展你使用抽象工厂的工厂类。如果使用创建方法扩展该类,那么您正在使用工厂方法。
所以,在你的代码中,ProductFactory是一个抽象工厂,make是Factory Method,对吧? – Alcott
'Abstract Factory'和'Factory Method'之间的区别是它自己的一个问题:)总之,当你使用类型鉴别符时,就像我在例子中所做的那样,我们使用“参数化工厂方法” - 一种方法知道如何创建不同类型的对象。但是,这可以出现在抽象工厂或工厂方法模式中。一个简单的技巧:如果你正在扩展工厂类,你正在使用'Abstract Factory'。如果你用_factory methods_扩展这个类,那么你正在使用'Factory Methods'。如果差异还不清楚,就会对SO提出不同的问题。 –
要说清楚。我的答案不是使用'工厂方法'设计模式,而是'抽象工厂'设计模式。 –