woieha320r的博客

工厂

用于隐藏实例化过程

不隐藏

· 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 : 实例化