java - Java中的设计模式和OOP原理
问题描述
要解决的问题:
“有几种类型的会计服务订单。这些订单的当前解决方案是为每种类型创建一个新类(基于工作类型,例如审计或日常工作,订单是否针对优先客户,以及是否订单是一次性或定期安排的工作)。整个系统有 66 * 2 * 2 个这些类(264 个订单类!),其中 8 个(2*2*2)提供给您作为示例 – CPA希望您找到一种方法来减少此类负载,而不会破坏现有的 Order 接口。”
与问题相关的代码:
if (isScheduled) {
if (1 == orderType) {
if (isCritical) {
order =
new FirstOrderTypeScheduled(
id, clientID, date, criticalLoading, maxCountedEmployees, numQuarters);
} else {
order = new Order66Scheduled(id, clientID, date, maxCountedEmployees, numQuarters);
}
} else if (2 == orderType) { // 2 is audit
if (isCritical) {
order = new CriticalAuditOrderScheduled(id, clientID, date, criticalLoading, numQuarters);
} else {
order = new NewOrderImplScheduled(id, clientID, date, numQuarters);
}
} else {
return null;
}
} else {
if (1 == orderType) {
if (isCritical) {
order = new FirstOrderType(id, clientID, date, criticalLoading, maxCountedEmployees);
} else {
order = new Order66(id, clientID, date, maxCountedEmployees);
}
} else if (2 == orderType) {
if (isCritical) {
order = new CriticalAuditOrder(id, clientID, date, criticalLoading);
} else {
order = new NewOrderImpl(id, clientID, date);
}
} else {
return null;
}
}
因此,上述问题中指出了几种类型的类(8 类)。我想问的是,在设计原则和 OO 设计原则(SOLID)中,有没有我应该应用的方法来解决上述问题?(我正在考虑使用桥接模式)
提前致谢!
解决方案
可能对您有所帮助的创造型设计模式是工厂和建造者。
如果你有一个接口(比如说 IOrder)和多个实现,你可以使用工厂模式:
您将有一个 OrderFactory 类,它将根据一些参数创建订单,它可以是这样的:
public class OrderFactory {
public IOrder createOrder( boolean isScheduled, int orderType, boolean isCritical){
// here will be the logic from your post and the order will be returned
}
}
使用工厂模式,您还可以拥有多个嵌套工厂,我认为您的示例可能就是这种情况 - 这称为抽象工厂。这更复杂,您可以在此处查看示例: https ://www.geeksforgeeks.org/abstract-factory-pattern/
推荐阅读
- performance - 自 iOS 12 以来,其他人的 Scenekit 应用程序是否变慢并开始卡顿?
- jquery - 如何只勾选一个复选框
- python - Django REST Framework Web 登录不起作用
- python - python将ode与固定时间步长集成
- resttemplate - 使用 PowerMockito 模拟 postForObject 会引发错误
- mysql - 如何选择列值作为列名但我不知道字段值 MYSQL
- php - 将帖子 ID 传递给 Twig/Timber 函数
- sql - SQL - 如果所有记录都具有特定值,如何仅从子查询中检索记录
- javascript - 在Javascript中将对象的一部分从数字键转换为数组
- bluetooth - NFC 到蓝牙转换器