【发布时间】:2018-03-05 04:37:14
【问题描述】:
在写问题之前,我阅读了以下参考资料:
- Factory Method Vs Abstract Factory
- Abstract Factory vs Factory Method (scope)
- Abstract Factory, Factory Method, Builder
- Factory, Abstract Factory and Factory Method
- Differences between Abstract Factory Pattern and Factory Method
我看到许多像我一样的人很难“掌握”抽象工厂和工厂模式之间的具体区别。 我不熟悉设计模式,我遇到了这个例子http://www.oracle.com/technetwork/java/dataaccessobject-138824.html,我正在尝试加深这个话题。
通过比较,我发现对于 3 个 DTO,我们有:
1) 抽象工厂
- 1 个抽象类(带有 3 个抽象方法和 3 个 switch-case);
- 3 个持久化类型的工厂类(每个都有 3 种获取 DTO DAO 的方法)
- 3 个接口和 9 个 DAO。
2) 工厂方法:
- 3 个工厂类,每个接口一个(每个都有 3 个开关案例);
- 可能我可以创建 3 个超类来扩展 DAO 类以不重复代码,例如用于连接到数据库的代码;
- 3 个接口和 9 个 DAO。
从代码数量的角度来看,我没有看到任何实质性差异。 在您需要添加新的持久性支持或新接口/DTO 的情况下,差异很小(并且是互补的)。
从客户的角度来看:
1) 抽象工厂:
public static final int PERSISTENCE_TYPE = DAOFactory.ORACLE;
DAOFactory daoFactory = DAOFactory.getDAOFactory(PERSISTENCE_TYPE);
CustomerDAO cDAO = daoFactory.getCustomerDAO();
AccountDAO aDAO = daoFactory.getAccountDAO();
OrderDAO oDAO = daoFactory.getOrderDAO();
2) 工厂方法:
public static final int PERSISTENCE_TYPE = DAOFactory.ORACLE;
CustomerDAO cDAO = CustomerDAOFactory.getCustomerDAO(PERSISTENCE_TYPE);
AccountDAO aDAO = AccountDAOFactory.getAccountDAO(PERSISTENCE_TYPE);
OrderDAO oDAO = OrderDAOFactory.getOrderDAO(PERSISTENCE_TYPE);
在持久性类型方面使用 DAOFactory 并返回与该支持相关的所有 DAO,而不是为每个 DTO 使用多个 DAOFactory 来获取所用持久性类型的 DAO,是否有优势?
目前我只看到使用抽象工厂的美学概念差异,是否还有我对软件设计的无知无法掌握的实用优势?
【问题讨论】:
标签: java design-patterns dao abstract-factory factory-method