---
title: "工厂模式"
date: "2026-03"
category: "设计模式与架构"
tags: ["设计模式与架构"]
description: "这个有点意思，本质上也是一种高阶函数的运用，即将自己的对外接口暴露为接受一个key和func\\<key,V>。这里的key即是当前func的元素，V是C#类型声明定义下的输出类型..."
source: "https://enriquemark.com/zh-hans/posts/%E5%B7%A5%E5%BB%A0%E6%A8%A1%E5%BC%8F"
---

这个有点意思，本质上也是一种高阶函数的运用，即将自己的对外接口暴露为接受一个key和func\<key,V>。这里的key即是当前func的元素，V是C#类型声明定义下的输出类型。工厂内部会根据传入的内容进行操作，而这种自己不执行而是把函数交给工厂执行的方式就叫做委托。也是字面意思，我不弄，只给你key和func，剩下的你自己弄。

轻量级的工厂模式只有方法，但更标准的则是直接传一个类进去了。

```C#
// C# 直接用內建的 Func，不用自己定義
TValue GetOrAdd(TKey key, Func<TKey, TValue> factory)
```

```TS
// TS 直接用箭頭函數類型，也不用定義
function getOrAdd<TKey, TValue>(key: TKey, factory: (key: TKey) => TValue): TValue
```

然后接口的用法也可以

```TS
// 用 interface 定義
interface Factory<TKey, TValue> {
    (key: TKey): TValue;  // 調用簽名語法
}

// 函數類型，返回值在箭頭右邊，不在 <> 裏
// 仔細看會發現，這裏的形式其實跟上面的接口差不多，括號指代函數
type Func<TKey, TValue> = (key: TKey) => TValue;
```

`(key: TKey): TValue` 本身用()包住意味著这是个函数，同时用`TValue`声明它的返回类型。但对于整个接口来说，这些类型必须外部传入，因此才有`<TKey, TValue>`。这个地方其实容易弄混，C#的`Func`类型，默认会把最后一个泛型作为输出类型，但ts这里就不一样。
