3. 抽象工厂模式(Abstract Factory)

问题:需要创建一整套相关对象(比如不同风格的 UI 组件)。

核心:在工厂方法的基础上再抽象一层,一个工厂负责生产一套产品。

class LightFactory {
  createButton() { return { render: () => '浅色按钮' }; }
  createInput()  { return { render: () => '浅色输入框' }; }
}

class DarkFactory {
  createButton() { return { render: () => '深色按钮' }; }
  createInput()  { return { render: () => '深色输入框' }; }
}

function createUI(theme) {
  const factories = { light: LightFactory, dark: DarkFactory };
  return new factories[theme]();
}

const ui = createUI('dark');
console.log(ui.createButton().render()); // 深色按钮
package abstractfactory

import "fmt"

type Button interface{ Render() string }
type Input interface{ Render() string }

type UIFactory interface {
  CreateButton() Button
  CreateInput() Input
}

// 浅色
type LightButton struct{}
func (b LightButton) Render() string { return "浅色按钮" }

type LightInput struct{}
func (i LightInput) Render() string { return "浅色输入框" }

type LightFactory struct{}
func (f LightFactory) CreateButton() Button { return LightButton{} }
func (f LightFactory) CreateInput() Input   { return LightInput{} }

// 深色
type DarkButton struct{}
func (b DarkButton) Render() string { return "深色按钮" }

type DarkInput struct{}
func (i DarkInput) Render() string { return "深色输入框" }

type DarkFactory struct{}
func (f DarkFactory) CreateButton() Button { return DarkButton{} }
func (f DarkFactory) CreateInput() Input   { return DarkInput{} }

func NewUIFactory(theme string) (UIFactory, error) {
  switch theme {
  case "light":
    return LightFactory{}, nil
  case "dark":
    return DarkFactory{}, nil
  default:
    return nil, fmt.Errorf("未知主题: %s", theme)
  }
}