当前位置: 首页 > article >正文

【设计模式】【创建型模式(Creational Patterns)】之工厂方法模式

工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它提供了一种创建对象的接口,但允许子类决定要实例化的类。这样,工厂方法模式可以让类的实例化推迟到子类。

UML 类图

下面是工厂方法模式的 UML 类图:

+-----------------+         +-----------------+
| Creator         |<--------| ConcreteCreator  |
+-----------------+         +-----------------+
| +factoryMethod(): Product | +factoryMethod(): ConcreteProduct |
+-----------------+         +-----------------+
| +anOperation()           |                  |
+-----------------+         +-----------------+

+-----------------+         +-----------------+
| Product         |<--------| ConcreteProduct  |
+-----------------+         +-----------------+
| +interface()    |         | +concreteInterface() |
+-----------------+         +-----------------+

在这个 UML 类图中:

  • Creator 是一个抽象类,定义了一个 factoryMethod 方法,用于创建 Product 对象。
  • ConcreteCreator 是 Creator 的具体实现类,实现了 factoryMethod 方法,创建具体的 Product 对象。
  • Product 是一个抽象类,定义了一个 interface 方法。
  • ConcreteProduct 是 Product 的具体实现类,实现了 interface 方法。

Java 代码示例

// 抽象产品类
interface Product {
    void interfaceMethod();
}

// 具体产品类
class ConcreteProduct implements Product {
    @Override
    public void interfaceMethod() {
        System.out.println("ConcreteProduct method called");
    }
}

// 抽象创建者类
abstract class Creator {
    public abstract Product factoryMethod();

    public void anOperation() {
        Product product = factoryMethod();
        product.interfaceMethod();
    }
}

// 具体创建者类
class ConcreteCreator extends Creator {
    @Override
    public Product factoryMethod() {
        return new ConcreteProduct();
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Creator creator = new ConcreteCreator();
        creator.anOperation();
    }
}

C++ 代码示例

#include <iostream>

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

// 具体产品类
class ConcreteProduct : public Product {
public:
    void interfaceMethod() override {
        std::cout << "ConcreteProduct method called" << std::endl;
    }
};

// 抽象创建者类
class Creator {
public:
    virtual Product* factoryMethod() = 0;
    virtual ~Creator() {}

    void anOperation() {
        Product* product = factoryMethod();
        product->interfaceMethod();
        delete product;
    }
};

// 具体创建者类
class ConcreteCreator : public Creator {
public:
    Product* factoryMethod() override {
        return new ConcreteProduct();
    }
};

// 客户端代码
int main() {
    Creator* creator = new ConcreteCreator();
    creator->anOperation();
    delete creator;
    return 0;
}

Python 代码示例

# 抽象产品类
class Product:
    def interface_method(self):
        pass

# 具体产品类
class ConcreteProduct(Product):
    def interface_method(self):
        print("ConcreteProduct method called")

# 抽象创建者类
class Creator:
    def factory_method(self):
        pass

    def an_operation(self):
        product = self.factory_method()
        product.interface_method()

# 具体创建者类
class ConcreteCreator(Creator):
    def factory_method(self):
        return ConcreteProduct()

# 客户端代码
if __name__ == "__main__":
    creator = ConcreteCreator()
    creator.an_operation()

Go 代码示例

package main

import "fmt"

// 抽象产品接口
type Product interface {
    InterfaceMethod()
}

// 具体产品类
type ConcreteProduct struct{}

func (cp *ConcreteProduct) InterfaceMethod() {
    fmt.Println("ConcreteProduct method called")
}

// 抽象创建者接口
type Creator interface {
    FactoryMethod() Product
    AnOperation()
}

// 具体创建者类
type ConcreteCreator struct{}

func (cc *ConcreteCreator) FactoryMethod() Product {
    return &ConcreteProduct{}
}

func (cc *ConcreteCreator) AnOperation() {
    product := cc.FactoryMethod()
    product.InterfaceMethod()
}

// 客户端代码
func main() {
    creator := &ConcreteCreator{}
    creator.AnOperation()
}

代码逻辑详解

  1. 产品接口 (Product): 定义了所有具体产品的共同接口。
  2. 具体产品 (ConcreteProductAConcreteProductB): 实现了产品接口的具体类。
  3. 创造者抽象类 (Creator): 声明了工厂方法,该方法返回一个产品对象。同时包含一些通用业务逻辑。
  4. 具体创造者 (ConcreteCreatorAConcreteCreatorB): 实现了具体的工厂方法,负责创建对应的具体产品。

通过这种方式,客户端不需要知道具体的产品是如何被创建的,只需要调用创造者的工厂方法即可获得所需的产品对象。这样使得系统更加灵活和可扩展。


http://www.kler.cn/a/406199.html

相关文章:

  • Python中Tushare(金融数据库)入门详解
  • AWS CLI
  • 操作系统——揭开盖子
  • 移动充储机器人“小奥”的多场景应用(上)
  • 【数据库入门】关系型数据库入门及SQL语句的编写
  • 开源TTS语音克隆神器GPT-SoVITS_V2版本地整合包部署与远程使用生成音频
  • Utf8Json 枚举序列化为整型(默认string)
  • 《剖析 Spring 原理:深入源码的旅程(一)》
  • ⭐️ GitHub Star 数量前十的工作流项目
  • 11.19 机器学习-梯度下降
  • unity3d——基础篇2刷(Mathf)
  • PyCharm的类型警告: Expected type ‘SupportsWrite[bytes]‘, got ‘BinaryIO‘ instead
  • 通过IIC访问模块寄存器[ESP--1]
  • springboot图书馆预约与占座小程序
  • RT-DETR融合[TIP2023]DehazeFormer中的SKFusion模块及相关改进思路
  • C++算法练习-day42——98.验证二叉搜索树
  • 31、js中日期操作
  • vulfocus在线靶场:CVE_2019_16662 速通手册
  • 耿恭坚守城池的方法
  • c++11的动态类型
  • 【AIGC】ChatGPT提示词Prompt解析:拒绝的艺术:如何优雅地说“不“
  • 如何为PDF文件创建口令密码
  • 如何在MATLAB中实现图像自动分割
  • C语言基础学习:抽象数据类型(ADT)
  • 远程服务器Docker使用本地代理加速访问外部资源
  • gitlab:使用脚本批量下载项目,实现全项目检索