阐述完简单工厂模式后,我们认识到了些许不足。此方式有时会违背开闭原则——由于更新的新品需要调整工厂类的代码,而这种调整并不理想。为了改善该问题,并且更好地利用简单工厂模式的优点,我们选择采纳工厂方法模式进行补充。
“工厂方法”模式是一种实用且灵活的设计策略,它让我们在创建对象时有更大空间去调整和实现,不需要更改生成器类就可以完成实例化过程。
为了适应新产品的加入而不影响原有的生产流程,可以利用工厂方法模式来调整判断规则。这种模式中,工厂不再承担全能生产的职责,而是为特定产品单独设立独立的工厂,以保持产品的针对性和专业性。
工厂方法模式定义:
工厂方法模式巧妙地融合了对象创建的基本要素。通过抽象接口明确定义对象构建的方式,不同子类根据实际需求从多个可行的具体类中选择合适者进行实例化,从而完成对象创建的步骤。而整个过程,正是通过对实例化操作的延迟实行,使得制造产品的任务交给了更具灵活性的子类。
在工厂方法模式中,有以下几种角色:
1. 抽象产品类:定义了产品的抽象方法,不提供具体实现。
2. 具体产品类:实现了抽象产品类中定义的抽象方法。
抽象工厂类,作为工厂方法模式的独特之处,主要专注于为创建产品提供必需的抽象方法。
精准生产型:根据对抽象工厂模式的解读,此类模式基于抽象方法,负责特定产品的创建和执行相应操作。
// 抽象产品类
class AbstractProduct{
public:
AbstractProduct(){}
// 抽象方法
void printName(){}
void play(){}
};
相较而言,工厂方法模式更加尊崇开闭原则。它以特定类作为生产者,根据需求迅速产出相应产品,不需要改变原生代码就能轻松扩展系统功能。可见,工厂方法为提高灵活性和拓展性提供了重要手段。
// 定义三个产品类 basketball
class Basketball : public AbstractProduct{
public:
Basketball(){
printName();
play();
}
// 具体实现方法
void printName()
{
cout << "Jungle get Basketball\n";
}
void play()
{
cout << "Jungle play Basketball\n";
}
};
// 定义三个产品类 Football
class Football : public AbstractProduct{
public:
Football(){
printName();
play();
}
// 具体实现方法
void printName()
{
cout << "Jungle get Football\n";
}
void play()
{
cout << "Jungle play Football\n";
}
};
// 定义三个产品类 Volleyball
class Volleyball : public AbstractProduct{
public:
Volleyball(){
printName();
play();
}
// 具体实现方法
void printName()
{
cout << "Jungle get Volleyball\n";
}
void play()
{
cout << "Jungle play Volleyball\n";
}
};
在我们的日常与职业生活中,工厂方法模式随处可见。以户外运动为例,无论是钟爱篮球、足球还是排球,都能找到自己喜欢的项目。为了便于管理和使用,每个项目都配有专门的保管室,让您快速方便地找到所需物品。这即是工厂方法模式的生动诠释,使生活更井然有序。
科技飞速发展和社会变革推动了工厂方法模式的深度扩展以及其广泛用途。例如,自动化生产线可以借助工厂方法模式来提高生产效率。此外,这种模式也可以巧妙地与其他设计模式结合起来,塑造出更精密、更强大的体系。通过借鉴工厂方法模式,有效弥补了简单工厂模式的不足之处,从而增强系统的灵活度和潜能。这个实用性很强的设计模式在许多领域都备受青睐。希望本文能够帮助大家更好地了解和应用工厂方法模式。如果您对此有任何疑问或者建议,欢迎在评论区留言分享,让我们共襄盛举,共同探讨,共享智慧!
// 抽象工厂类
class AbstractFactory{
public:
AbstractFactory(){}
// 提供公共的方法
virtual AbstractProduct *getSportProduct() = 0;
};
// 具体工厂类
class BasketballFactory : public AbstractFactory{
public:
BasketballFactory()
{
cout << "BasketballFactory\n";
}
AbstractProduct *getSportProduct()
{
cout << "basketball" << endl;
return new Basketball();
}
};
// 具体工厂类
class FootballFactory : public AbstractFactory{
public:
FootballFactory()
{
cout << "BasketballFactory\n";
}
AbstractProduct *getSportProduct()
{
cout << "football" << endl;
return new Football();
}
};
// 具体工厂类
class VolleyballFactory : public AbstractFactory{
public:
VolleyballFactory()
{
cout << "VolleyballFactory\n";
}
AbstractProduct *getSportProduct()
{
cout << "volleyball" << endl;
return new Volleyball();
}
};