---
title: "工廠模式"
date: "2026-03"
category: "設計模式與架構"
tags: ["設計模式與架構"]
description: "這個有點意思，本質上也是一種高階函式的運用，即將自己的對外介面暴露為接受一個key和func\\<key,V>。這裡的key即是當前func的元素，V是C#型別宣告定義下的輸出型別..."
source: "https://enriquemark.com/zh-hant/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這裡就不一樣。
