泛型客户体系中GetCustomer方法的设计位置与使用方式咨询
泛型客户类型的GetCustomer方法设计方案
我来帮你梳理这个问题,结合你给出的泛型接口和抽象基类结构,咱们一步步来解决:
一、先确定GetCustomer方法该放哪
首先得明确:这个方法是要根据存储的客户类型(黄金/白银)返回对应的具体实例,直接放在泛型接口ICustomerInterface<T>或者抽象基类BaseCustomer<T>的实例方法里不太合适——因为泛型接口和基类是和具体的T绑定的,而我们需要的是一个能动态根据类型标识创建实例的入口。
比较推荐的两种方式:
- 单独搞一个客户工厂类,把创建逻辑封装进去,符合单一职责原则,后续扩展新客户类型也方便;
- 如果不想新增类,也可以在抽象基类里加静态方法(毕竟实例方法得先有实例才能调用,而我们要做的是创建实例)。
二、补全基础代码(先把你给的代码补完整)
首先假设我们有具体的黄金、白银客户类,还有补全后的基类和接口:
public interface ICustomerInterface<T> where T : BaseCustomer<T>, new() { T MakeCustomer(); } public abstract class BaseCustomer<T> : ICustomerInterface<T> where T : BaseCustomer<T>, new() { public string Type { get; set; } public abstract T MakeCustomer(); } // 黄金客户实现 public class GoldCustomer : BaseCustomer<GoldCustomer> { public override GoldCustomer MakeCustomer() { return new GoldCustomer { Type = "Gold" }; } } // 白银客户实现 public class SilverCustomer : BaseCustomer<SilverCustomer> { public override SilverCustomer MakeCustomer() { return new SilverCustomer { Type = "Silver" }; } }
三、实现GetCustomer方法
方案1:用工厂类(推荐)
创建一个CustomerFactory静态类,里面封装获取存储类型、创建对应客户的逻辑:
public static class CustomerFactory { // 模拟从缓存/数据库读取最后创建的客户类型 private static string GetLastStoredCustomerType() { // 这里替换成你实际的存储读取逻辑,比如从Redis、DB取 return "Gold"; // 示例返回黄金客户类型 } // 强类型版本:指定T类型返回对应客户 public static T GetCustomer<T>() where T : BaseCustomer<T>, new() { return new T().MakeCustomer(); } // 动态版本:自动根据存储的类型返回对应客户 public static BaseCustomer<object> GetLastCustomer() { string customerType = GetLastStoredCustomerType(); switch (customerType) { case "Gold": return new GoldCustomer().MakeCustomer() as BaseCustomer<object>; case "Silver": return new SilverCustomer().MakeCustomer() as BaseCustomer<object>; default: throw new ArgumentException($"没找到对应的客户类型:{customerType}"); } } }
方案2:基类静态方法
如果不想新增工厂类,也可以把静态方法加到抽象基类里:
public abstract class BaseCustomer<T> : ICustomerInterface<T> where T : BaseCustomer<T>, new() { public string Type { get; set; } public abstract T MakeCustomer(); // 静态方法获取对应类型的客户 public static T GetCustomer() { // 如果需要结合存储的类型,这里可以先读取存储的类型,再判断实例化 return new T().MakeCustomer(); } }
四、怎么用GetCustomer方法
1. 用工厂类的强类型方法
// 获取黄金客户 GoldCustomer myGoldCustomer = CustomerFactory.GetCustomer<GoldCustomer>(); Console.WriteLine(myGoldCustomer.Type); // 输出 "Gold" // 获取白银客户 SilverCustomer mySilverCustomer = CustomerFactory.GetCustomer<SilverCustomer>(); Console.WriteLine(mySilverCustomer.Type); // 输出 "Silver"
2. 用工厂类的动态方法(自动读取存储的最后客户类型)
var lastCreatedCustomer = CustomerFactory.GetLastCustomer(); Console.WriteLine(lastCreatedCustomer.Type); // 输出存储的客户类型,比如"Gold"
3. 用基类的静态方法
GoldCustomer gold = BaseCustomer<GoldCustomer>.GetCustomer(); SilverCustomer silver = BaseCustomer<SilverCustomer>.GetCustomer();
额外补充:更灵活的动态创建方式
如果后续要加更多客户类型,不想每次都改switch case,可以用反射实现:
public static BaseCustomer<object> GetLastCustomerWithReflection() { string customerType = GetLastStoredCustomerType(); // 注意替换成你的命名空间 Type targetType = Type.GetType($"YourAppNamespace.{customerType}Customer"); if (targetType == null) throw new ArgumentException($"无效的客户类型:{customerType}"); var customerInstance = Activator.CreateInstance(targetType) as BaseCustomer<object>; return customerInstance?.MakeCustomer() as BaseCustomer<object>; }
内容的提问来源于stack exchange,提问作者fuzzybear
相关产品推荐
相关产品推荐

