面向对象设计与分析40讲(12)简单工厂方法模式

发布时间:2023年12月24日

文章目录

定义

简单工厂模式是一种创建型模式,用于根据客户端的需求创建对象实例,所谓的需求反映到编程语言里就是传入的参数。

简单工厂模式包括三个主要部分:

  • 工厂类(Simple Factory):这是整个模式的核心。它负责根据客户端的请求来创建并返回相应的对象实例。
  • 产品抽象类(Product Interface):定义了被创建产品的接口
  • 具体产品类(Concrete Products):实现了产品接口的具体类,由工厂类根据客户需要创建并返回给客户端。

UML关系图如下:

上图Factory的CreateProduct方法是需要参数的,它根据参数创建不同类的实例,例如可能是产品类名。

简单工厂模式隐藏了对象创建逻辑,用户只需传入工厂方法所需参数即可得到对象。

示例

#include <iostream>
#include <string>

using namespace std;

// 抽象产品类
class Product {
public:
    virtual void Operation() = 0; 
};

// 具体产品类 A
class ConcreteProductA : public Product {
public:
    virtual void Operation() {
        cout << "Operation from Product A" << endl;
    }
};

// 具体产品类 B
class ConcreteProductB : public Product {
public:
    virtual void Operation() {
        cout << "Operation from Product B" << endl;
    }
};


// 工厂类,负责创建产品对象
class SimpleFactory {
public:
    Product* CreateProduct(const std::string& product_name) {
    	if (product_name == "A") {
    		return new ConcreteProductA();
    	} else if(product_name == "B") {
    		return new ConcreteProductB();
    	} else {
    		return nullptr;
    	}
	}
};

// 客户端代码
int main() {
	SimpleFactory factory;
	Product* A = factory.CreateProduct("A");
	if(A) {
		A->Operation();
		delete A;
	}
	
	Product* B = factory.CreateProduct("B");
	if(B) {
		B->Operation();
		delete A;
	}
    return 0;
}

优缺点

它具有以下几个优点:

  1. 隐藏对象的创建逻辑:简单工厂模式将对象的创建过程封装在一个工厂类中,客户端只需要通过工厂类来获取所需的产品对象,而无需关心具体的创建细节。这样可以降低客户端与具体产品类之间的耦合度。

  2. 集中管理对象的创建:通过使用简单工厂模式,可以集中管理对象的创建过程,避免了对象的创建分散在多处的情况。这样可以使得代码更加清晰、易于维护和扩展。

  3. 可扩展:如果需要新增一种产品类型,只需要在工厂类中添加相应的创建逻辑即可,而无需修改客户端的代码。站在客户端的角度看,这符合开闭原则,对扩展开放、对修改关闭。

  4. 提高代码的可测试性:由于简单工厂模式将对象的创建过程与具体产品类解耦,可以方便地对工厂类进行单元测试,验证其创建的产品对象是否符合预期。

尽管简单工厂模式具有上述优点,但也存在一些潜在的缺点:

  1. 当新增产品类型时,需要修改工厂类的代码,违背了开闭原则
  2. 随着产品类型的增多,工厂类可能变得庞大,条件分支变得复杂,不易于维护
  • 只能创建一类产品

在具体应用中,需要根据实际情况选择合适的设计模式。

适用场景:

  1. 工厂类负责创建的对象比较少;

  2. 客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心

文章来源:https://blog.csdn.net/HandsomeHong/article/details/135175988
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。