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!