工厂
用于隐藏实例化过程
不隐藏
· Main直接根据条件实例化所需的ProductImpl
classDiagram
class Product {
<<interface>>
}
class ProductA
ProductA ..|> Product : 实现
class ProductB
ProductB ..|> Product : 实现
class Main
Main ..> ProductA : 实例化
Main ..> ProductB : 实例化
简单工厂
· 隐藏ProductImpl的实例化过程,这个过程可能很复杂,改由Factory::produce负责,Main通过入参告知其应提供哪个ProductImpl
· 但这样在新增ProductImpl时,需要修改Factory,违反了开闭原则;且所有ProductImpl都由Factory::produce产生,违反了单一原则
classDiagram
class Product {
<<interface>>
}
class ProductA
ProductA ..|> Product : 实现
class ProductB
ProductB ..|> Product : 实现
class Factory {
+produce(condition) Product
}
Factory ..> Product : 返回
Factory ..> ProductA : 实例化
Factory ..> ProductB : 实例化
class Main
Main ..> Factory : 实例化
工厂方法
· 每个ProductImpl都由一个专属的Factory::produce负责实例化,这样在新增ProductImpl时,只需新增Factory而不用修改任何服务类,Main需要哪种 ProductImpl仍由其自己判断并调用相应Factory的produce()获得
· 这里并没有产生“倒退”,因为最开始的动机是为了向Main隐藏“实例化流程”而非条件判断
classDiagram
class Product {
<<interface>>
}
class ProductA
ProductA ..|> Product : 实现
class ProductB
ProductB ..|> Product : 实现
class Factory {
<<interface>>
+produce() Product
}
class ProductAFactory {
+produce() ProductA
}
ProductAFactory ..|> Factory : 实现
ProductAFactory ..> ProductA : 返回
class ProductBFactory {
+produce() ProductB
}
ProductBFactory ..|> Factory : 实现
ProductBFactory ..> ProductB : 返回
class Main
Main ..> ProductAFactory : 实例化
Main ..> ProductBFactory : 实例化
抽象工厂
· 如果ProductImpl是分等级的:ProductAa、ProductAb、ProductBa、ProductBb,那么原本Factory中单一的produce()就需要扩展为a()、b()。这种 扩展是违反开闭原则的,所以Factory(产品族)可随意添加,但产品等级需要一开始考虑全面,后期几乎不可扩展
classDiagram
class Product {
<<interface>>
}
class ProductAa
ProductAa ..|> Product : 实现
class ProductAb
ProductAb ..|> Product : 实现
class ProductBa
ProductBa ..|> Product : 实现
class ProductBb
ProductBb ..|> Product : 实现
class Factory {
<<interface>>
+a() Product
+b() Product
}
class ProductAFactory {
+a() ProductAa
+b() ProductAb
}
ProductAFactory ..|> Factory : 实现
ProductAFactory ..> ProductAa : 返回
ProductAFactory ..> ProductAb : 返回
class ProductBFactory {
+a() ProductBa
+b() ProductBb
}
ProductBFactory ..|> Factory : 实现
ProductBFactory ..> ProductBa : 返回
ProductBFactory ..> ProductBb : 返回
class Main
Main ..> ProductAFactory : 实例化
Main ..> ProductBFactory : 实例化