使用静态工厂类创建CreateProgressDTO是否符合工厂模式规范?
这种静态工厂模式的用法完全可行,而且是非常好的实践
你的实现思路很合理,用静态工厂类封装CreateProgressDTO的创建逻辑,解决重复代码问题的同时,还带来了不少额外好处:
- 消除重复代码:把原本要在多处写的对象初始化逻辑集中到工厂类里,避免冗余代码,也减少了手动赋值出错的可能
- 保证逻辑一致性:比如
Progress的计算规则(像CreatedExactly里的四舍五入)只在工厂类里维护一次,不会出现不同地方计算进度方式不一致的问题 - 语义更清晰:调用
CreateProgressFactory.CreatedNone(total)比直接new CreateProgressDTO并手动赋值要直观得多,其他开发者一眼就能明白这个DTO代表的是“未创建任何实例”的进度状态 - 封装边界处理:
CreatedExactly里对total == 0的特殊情况做了统一处理,所有调用方都不用重复写这个判断逻辑,降低了漏处理边界场景的风险
额外优化建议
如果想进一步强化封装性,可以把CreateProgressDTO的构造函数设为私有,强制外部只能通过工厂类来创建实例,避免有人随意创建不符合规范的CreateProgressDTO对象:
public class CreateProgressDTO { // 私有构造函数,禁止外部直接new private CreateProgressDTO() {} public int Total { get; set; } public int Created { get; set; } public decimal Progress { get; set; } }
这样一来,所有CreateProgressDTO的实例都必须通过工厂类的方法生成,能更好地控制对象的创建规则。
附相关代码
CreateProgressDTO 类
public class CreateProgressDTO { public int Total { get; set; } public int Created { get; set; } public decimal Progress { get; set; } }
CreateProgressFactory 静态工厂类
public static class CreateProgressFactory { public static CreateProgressDTO CreatedAll(int total) { return new CreateProgressDTO() { Total = total, Created = total, Progress = 100m }; } public static CreateProgressDTO CreatedNone(int total) { return new CreateProgressDTO() { Total = total, Created = 0, Progress = 0m }; } public static CreateProgressDTO CreatedExactly(int total, int created) { if (total == 0) return CreatedNone(0); return new CreateProgressDTO() { Total = total, Created = created, Progress = Math.Round((decimal)created / total * 100, 2) }; } }
内容的提问来源于stack exchange,提问作者dafie
相关产品推荐
相关产品推荐

