在软件研发领域,定义特定对象无疑是一项关键环节。考虑到满足用户对对象使用的便捷性,减轻系统之间的耦合压力,以及确保系统的灵活适应性和可扩展性,创建型模式应时而生。值得一提的是,简单工厂模式以其易于理解,操作简便等特点,成为了最为常见,也是最受欢迎的设计模式之一。当然,尽管该模式不能直接归入GoF的23种设计模式之列,却为其他创建模式奠定了坚实基础。那么,何为简单工厂模式呢?下面就让我们共同揭晓答案吧!
简单工厂模式,也被叫做创造模式,其原理是构建一个专门的工厂类,以便依据特定的参数生成对应的子类实例。这些子类都有公用的父类,这意味着用户只需调用工厂类的方法,然后提供相应的商品参数就能获取到他们所需要的产品实例。
让我们来思考一种有趣的场景——假如你经营着一家体育用品制造公司,其职责便是按照客户的不同要求,如篮球、足球或排球等,量身定制相应的商品。在此情境下,客户通常只需告知工厂所需产品的一些关键参数即可,并不需介入产品生产的琐碎细节。这种显然就是简单工厂模式的实际应用了。
简易工厂模式的执行过程非常明了。首先,我们构建一个抽象产品类,内含许许多多的抽象方法但未提供具体实作;接着,创立诸多具体产品类,透过分别实现抽象产品类的抽象方法予以充实;此后,再设立一个工厂类,依据不同性质的输入参数,获取相应的具体产品实例;最终,顾客只需运用工厂对象的各项功能,加上所需的产品参数,就能轻松拿到心仪的产品实例。
在经典的单件式工厂模式中,我们主要看到以下三种角色:抽象产品类、具体产品类以及工厂类。抽象产品类是公共功能的定义者,具体产品类则依据个性化需求来充实这些方法。而工厂类就扮演了一个调剂的角色,通过接收并解析来自客户端的参数,然后应景地生成相应的特定产品实例对象。
让我给您举个实用的例子吧。咱们设想有一家体育用品店,店内设有一个储藏柜专门用来储存顾客购买的各类运动用品如篮球、足球及排球。若想取得这些物品,顾客不仅要持有相应凭证,还需先前往储藏柜处领取相应物品。这时候,简单工厂模式就能轻松派上用场了。
// 抽象产品类
class AbstractProduct{
public:
// 抽象方法
...
};
// 具体产品类 basketball
class ConcreteProduct : public AbstractProduct{
public:
// 具体实现方法
};
// 工厂类
class Factory{
public:
AbstractProduct createProduct(string productName)
{
AbstractProduct pro = nullptr;
if(productName == "ProductA")
pro = new ProductA();
else if(productName == "ProductB")
pro = new ProductB();
...
return pro;
}
};
首先,我们设计出了一个名为“运动球类产品”的抽象品种,它涵盖了诸如“使用”与“保管”等基本功能。接下来,我们分别构建了篮球、足球以及排球这三种具备这些共性功能的具体品种。在此之上,我们又设计了一个被命名为“保管室”的工厂品种,以便根据顾客所需,提供量身定制的具体品种实例。最后,尊敬的顾客只需向工厂提供您所需的具体品种名称,便能方便快捷地得到心仪之物。
简易工厂模式为我们带来诸多优势呢!首先,它成功地将对象的生成操作与实际使用分离开来,有效降低了整个系统的耦合性;其次呢,这种模式还便于系统进行修改和扩展哦。若想要新增某种特定产品,只需从抽象产品类衍生出一个新类,再针对这个新类在工厂类的相应方法上添加必要的条件判断便可。如此不仅遵循了开闭原则(即对外开放随需拓展,对内封闭避免更改),而且也无需大动干戈修改既有代码呢。
简而言之,我们需要认识到,即使简单工厂模式有其优势,它仍然存在一些局限性。首先,所有的决策逻辑都依赖于工厂类的实现,如果开发者在代码设计中出了差错,就很可能会对整个系统产生不良影响。其次,随着新产品的加入,必须要更新工厂类的代码,这不符合开闭原则。因此,作为设计师或工程师,我们必须明智地评估各种因素,并根据实际情况选择最适合的设计模式。
// 抽象产品类
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 Factory{
public:
AbstractProduct *getSportProduct(string productName)
{
AbstractProduct *pro = nullptr;
if(productName == "Basketball")
pro = new Basketball();
else if(productName == "Football")
pro = new Football();
else if(productName == "Volleyball")
pro = new Volleyball();
return pro;
}
};