设计模式之工厂方法模式

设计模式之工厂方法模式(Factory Method Pattern)

模式定义

工厂方法模式(Factory Method Pattern)又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式,它属于类创建型模式。在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。

类图

代码

//抽象产品类
class Product {
public:
    virtual void use() = 0;
    //抽象类的析构函数设置为虚函数
	virtual ~Product() {}
};

class ProductA : public Product {
public:
    void use() override
    {
    	cout << "void ProductA::use()" << endl;
    }
};
class ProductB : public Product {
public:
    void use() override
    {
    	cout << "void ProductB::use()" << endl;
    }
};

//抽象工厂类
class Factory {
public:
    virtual Product* createProduct() = 0;
	virtual ~Factory() {}
};

class FactoryA : public Factory {
public:
    Product* createProduct() override {
    	return new ProductA();
	}
};
class FactoryB : public Factory {
public:
    Product* createProduct() override {
    	return new ProductB();
	}
};

void test()
{
    //生产产品A
	unique_ptr<Factory> factoryA(new FactoryA());
	unique_ptr<Product> productA(factoryA->createProduct());
	productA->use();
	//生产产品B
	cout << endl << endl;
	unique_ptr<Factory> factoryB(new FactoryB());
	unique_ptr<Product> productB(factoryB->createProduct());
	productB->use();
}

工厂方法模式的优点

  1. 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程。
  2. 灵活性增强,对于新产品的创建,只需多写一个相应的工厂类。
  3. 典型的解耦框架。高层模块只需要知道产品的抽象类,无须关心其他实现类,满足迪米特法则、依赖倒置原则和里氏替换原则。
  4. 对扩展开放对修改关闭;解决了简单工厂的缺点问题。

工厂方法模式的缺点

  1. 类的个数容易过多,增加复杂度。
  2. 增加了系统的抽象性和理解难度。
  3. 接口的传入参数类型需要一致,且只能对单一变化量接口使用。
  4. 工厂只能生产一种产品,此弊端可使用抽象工厂模式解决。

使用场景

  1. 客户只知道创建产品的工厂名,而不知道具体的产品名。
  2. 创建对象的任务由多个具体子工厂中的某一个完成,而抽象工厂只提供创建产品的接口。
  3. 客户不关心创建产品的细节,只关心产品的品牌。

参考博文

  1. https://design-patterns.readthedocs.io/zh-cn/latest/creational_patterns/factory_method.html
posted @   Invinc-Z  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示