导入
理解工厂模式
使用集中式工厂动态生成可配置的服务,这些工厂能够响应环境、标志或运行时配置。
...
...
The Factory Pattern creates service instances dynamically based on configuration
Node.js
1// Simulated client implementations 2class SqliteClient { 3 constructor(config) { 4 this.name = 'SQLite'; 5 this.file = config.dbFile || 'dev.db'; 6 } 7 8 connect() { 9 console.log(`Connecting to SQLite at ${this.file}`); 10 } 11} 12 13class PostgresClient { 14 constructor(config) { 15 this.name = 'PostgreSQL'; 16 this.host = config.dbHost || 'localhost'; 17 } 18 19 connect() { 20 console.log(`Connecting to PostgreSQL at ${this.host}`); 21 } 22} 23 24// Map environment to the correct client class 25const clientMap = { 26 development: SqliteClient, 27 production: PostgresClient, 28}; 29 30// Factory function returns the correct client based on config 31function createDatabaseClient(config) { 32 const Client = clientMap[config.env]; 33 if (!Client) throw new Error(`Unsupported environment: ${config.env}`); 34 return new Client(config); 35} 36 37// Usage 38const devConfig = { env: 'development', dbFile: 'test.db' }; 39const devClient = createDatabaseClient(devConfig); 40devClient.connect(); 41 42const prodConfig = { env: 'production', dbHost: 'prod.db.internal' }; 43const prodClient = createDatabaseClient(prodConfig); 44prodClient.connect();
TypeScript
1interface Config { 2 env: string; 3 dbFile?: string; 4 dbHost?: string; 5} 6 7interface DatabaseClient { 8 connect(): void; 9} 10 11class SqliteClient implements DatabaseClient { 12 constructor(private config: Config) {} 13 connect() { 14 console.log(`Connecting to SQLite at ${this.config.dbFile || 'dev.db'}`); 15 } 16} 17 18class PostgresClient implements DatabaseClient { 19 constructor(private config: Config) {} 20 connect() { 21 console.log(`Connecting to PostgreSQL at ${this.config.dbHost || 'localhost'}`); 22 } 23} 24 25// Map-based declarative factory 26const clientMap: Record<string, new (config: Config) => DatabaseClient> = { 27 development: SqliteClient, 28 production: PostgresClient, 29}; 30 31function createDatabaseClient(config: Config): DatabaseClient { 32 const Client = clientMap[config.env]; 33 if (!Client) throw new Error(`Unsupported environment: ${config.env}`); 34 return new Client(config); 35} 36 37// Usage 38const devConfig: Config = { env: 'development', dbFile: 'test.db' }; 39const devClient = createDatabaseClient(devConfig); 40devClient.connect(); 41 42const prodConfig: Config = { env: 'production', dbHost: 'prod.db.internal' }; 43const prodClient = createDatabaseClient(prodConfig); 44prodClient.connect();