JavaScript工厂模式

HTTP客户端-工厂模式

class HttpClient {
  constructor(config) {
    this.baseURL = config.baseURL;
    this.timeout = config.timeout;
    this.headers = config.headers;
  }
  
  async get(url) {
    // 模拟: HTTP GET 请求
    console.log(`GET ${this.baseURL}${url}`);
    return { data: 'mock data' };
  }
}

class HttpClientFactory {
  static createClient(type) {
    const configs = {
      api: {
        baseURL: 'https://api.example.com',
        timeout: 5000,
        headers: { 'Authorization': `Bearer ${localStorage.getItem('token')}` }
      },
      upload: {
        baseURL: 'https://upload.example.com',
        timeout: 30000,
        headers: { 'Content-Type': 'multipart/form-data' }
      },
      analytics: {
        baseURL: 'https://analytics.example.com',
        timeout: 2000,
        headers: { 'X-API-Key': process.env.ANALYTICS_API_KEY }
      }
    };
    const config = configs[type];
    if (!config) {
      throw new Error(`不支持的客户端类型: ${type}`);
    }
    return new HttpClient(config);
  }
}

// 使用:客户端代码完全解耦
const apiClient = HttpClientFactory.createClient('api');
const uploadClient = HttpClientFactory.createClient('upload');

apiClient.get('/users');
uploadClient.get('/files');

表单验证器-工厂模式

class EmailValidator {
  validate(value) {
    const valid = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value);
    return { valid, message: valid ? '' : '请输入有效的邮箱地址' };
  }
}

class PhoneValidator {
  validate(value) {
    const valid = /^1[3-9]\d{9}$/.test(value);
    return { valid, message: valid ? '' : '请输入有效的手机号码' };
  }
}

class ValidatorFactory {
  static createValidator(type) {
    const validators = {
      email: () => new EmailValidator(),
      phone: () => new PhoneValidator(),
    };
    const factory = validators[type];
    if (!factory) {
      throw new Error(`不支持的验证器类型: ${type}`);
    }
    return factory();
  }
}

// 使用:统一的验证接口
const emailValidator = ValidatorFactory.createValidator('email');
const phoneValidator = ValidatorFactory.createValidator('phone');

console.log(emailValidator.validate('test@example.com'));
console.log(phoneValidator.validate('13800138000'));

React组件-工厂模式

// 基础组件
const Button = ({ variant, children, ...props }) => {
  const classes = {
    primary: 'bg-blue-500 text-white',
    secondary: 'bg-gray-500 text-white'
  };
  return (
    <button className={`px-4 py-2 rounded ${classes[variant]}`} {...props}>
      {children}
    </button>
  );
};

const Input = ({ error, ...props }) => (
  <div>
    <input
      className={`border rounded px-3 py-2 ${error ? 'border-red-500' : 'border-gray-300'}`}
      {...props}
    />
    {error && <p className="text-red-500 text-sm mt-1">{error}</p>}
  </div>
);

// 组件工厂
class ComponentFactory {
  static components = {
    button: Button,
    input: Input,
  };
  static createComponent(type, props) {
    const Component = this.components[type];
    if (!Component) {
      throw new Error(`不支持的组件类型: ${type}`);
    }
    return React.createElement(Component, props);
  }
}

// 使用
const MyForm = () => {
  return (
    <div>
      {ComponentFactory.createComponent('input', { 
        placeholder: '请输入用户名' 
      })}
      {ComponentFactory.createComponent('button', { 
        variant: 'primary',
        children: '提交'
      })}
    </div>
  );
};

https://juejin.cn/post/7541039466799071272 稀土掘金

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值