What(是什么:定义)
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。
Why(为什么要使用:效果是什么)
工厂方法不再将与特定应用有关的类绑定到你的代码中。代码仅处理Product接口;因此它可以与用户定义的任何ConcreteProduct类一起使用。
工厂方法的一个潜在缺点在于客户可能仅仅为了创建一个特定的ConcreteProduct对象,就不得不创建Creator的子类。当Creator子类不必需时,客户现在必然要处理类演化的其他方面;但是当客户无论 如何必须创建Creator的子类时,创建子类也是可行的。
Who(变化的是谁:可变的方面)
被实例化的子类
When(什么情况下使用:适用性)
在下列情况下可以使用FactoryMethod模式
当一个类不知道它所必须创建的对象的类的时候。
当一个类希望由它的子类来指定它所创建的对象的时候。
当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。
Where(结构在哪里:结构UML)
How(如何实现:代码)
代码实现:
#include <iostream>
using namespace std;
class Product
{
public:
virtual void ConcreteProduct() = 0;
virtual ~Product() { }
};
class CPUProduct: public Product
{
public:
void ConcreteProduct()
{
cout << "I'm CPU ===============Product" << endl;
}
~CPUProduct()
{
cout << "destructor ==========CPUProduct" << endl;
}
};
class ScreenProduct: public Product
{
public:
void ConcreteProduct()
{
cout << "I'm Screen ============Product" << endl;
}
~ScreenProduct()
{
cout << "destructor ==========ScreenProduct" << endl;
}
};
class Factory
{
public:
virtual Product* CreateProduct() = 0;
virtual ~Factory() { }
};
class CPUFactory: public Factory
{
public:
Product * CreateProduct()
{
return new CPUProduct();
}
~CPUFactory()
{
cout << "destructor ==========CPUFactory" << endl;
}
};
class ScreenFactory: public Factory
{
public:
Product * CreateProduct()
{
return new ScreenProduct();
}
~ScreenFactory()
{
cout << "destructor ==========ScreenFactory" << endl;
}
};
int main()
{
unique_ptr<Factory> cpuFactory(new CPUFactory());
unique_ptr<Product> cpuProduct(cpuFactory->CreateProduct());
cpuProduct->ConcreteProduct();
unique_ptr<Factory> screenFactory(new ScreenFactory());
unique_ptr<Product> screenProduct(screenFactory->CreateProduct());
screenProduct->ConcreteProduct();
cout << "Hello World!" << endl;
return 0;
}
生活中的例子:
设计模式的核心:查找变化,封装变化
update:2021-08-18