2.工厂方法模式

设计模式——工厂方法模式

一、基本概念

1. 定义

工厂方法模式(英语:Factory method pattern)是一种实现了“工厂”概念的面向对象设计模式。就像其他创建型模式一样,它也是处理在不指定对象具体类型的情况下创建对象的问题。工厂方法模式的实质是“定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类。工厂方法让类的实例化推迟到子类中进行。”

2. 优缺点

优点:

  • 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程。
  • 灵活性增强,对于新产品的创建,只需多写一个相应的工厂类。
  • 典型的解耦框架。高层模块只需要知道产品的抽象类,无须关心其他实现类,满足迪米特法则、依赖倒置原则和里氏替换原则。

缺点:

  • 类的个数容易过多,增加复杂度
  • 增加了系统的抽象性和理解难度
  • 抽象产品只能生产一种产品,此弊端可使用抽象工厂模式解决。

3. 结构

工厂方法模式的主要角色如下:

  • 抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 newProduct() 来创建产品;
  • 具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建;
  • 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能;
  • 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应
classDiagram class Factory { <<interface>> +createShape() Shape } class RectangleFactory { +createShape() Shape } class CircleFactory { +createShape() Shape } class Shape { <<interface>> +draw() void } class Rectangle { +draw() void } class Circle { +draw() void } Factory <|.. RectangleFactory Factory <|.. CircleFactory Shape <|.. Rectangle Shape <|.. Circle RectangleFactory ..> Rectangle : 创建 CircleFactory ..> Circle : 创建

二、代码实现

#include <iostream>
#include <memory>
#include <string>
/*
* 产品
* */
class Shape {
/*
* 抽象产品
* */
public:
virtual ~Shape() = default;
virtual void show() = 0;
};
class Rectangle : public Shape {
/*
* 具体产品:矩形
* */
public:
void show() override {
std::cout << "I'm a rectangle." << std::endl;
}
};
class Circle : public Shape {
/*
* 具体产品:圆
* */
public:
void show() override {
std::cout << "I'm a circle." << std::endl;
}
};
/*
* 工厂
* */
class Factory {
/*
* 抽象工厂
* */
public:
virtual ~Factory() = default;
virtual std::unique_ptr<Shape> createShape() = 0;
};
class RectangleFactory : public Factory {
/*
* 生产矩形的工厂
* */
public:
std::unique_ptr<Shape> createShape() override {
std::cout << "正在生产矩形..." << std::endl;
return std::make_unique<Rectangle>();
}
};
class CircleFactory : public Factory {
/*
* 生产圆形的工厂
* */
public:
std::unique_ptr<Shape> createShape() override {
std::cout << "正在生产圆形..." << std::endl;
return std::make_unique<Circle>();
}
};
int main() {
std::string productName;
std::getline(std::cin, productName);
std::unique_ptr<Factory> factory;
if (productName == "Circle") {
factory = std::make_unique<CircleFactory>();
} else {
factory = std::make_unique<RectangleFactory>();
}
auto product = factory->createShape();
product->show();
return 0;
}

参考:


Thanks for reading!

2.工厂方法模式

2026-01-22
758 字 · 4 分钟

已复制链接

评论区

目录