简单工厂和工厂方法模式在实际应用中有何不同?请举例说明。
参考回答
简单工厂模式和工厂方法模式在实际应用中的区别主要体现在灵活性和扩展性上:
- 简单工厂模式:通过一个工厂类来决定实例化哪个具体产品。适用于产品种类较少、变动不频繁的情况。缺点是每次新增产品时需要修改工厂类,违反了开闭原则。
-
工厂方法模式:通过工厂方法将对象的创建推迟到子类,使得子类可以决定实例化哪个具体产品。适用于产品种类较多且频繁变化的场景,每个工厂类负责创建自己对应的产品,增加新的产品类时只需要新增具体工厂类,不需要修改现有代码。
详细讲解与拓展
1. 简单工厂模式应用场景与示例
应用场景:
简单工厂模式适合于产品种类较少,且变化不频繁的场景。例如,某个系统只需要创建几种类型的对象,且未来可能不需要新增很多产品,或者新增产品的操作不频繁。
示例:
假设我们有一个图形绘制系统,根据传入的形状类型来创建不同的图形。
解释:
– ShapeFactory
类负责根据传入的字符串来决定实例化哪个具体的图形对象。客户代码通过调用ShapeFactory.createShape()
来获得所需的图形对象。
– 这种方式适用于形状种类较少的场景,但如果未来新增很多形状类型,ShapeFactory
类就会变得庞大,维护起来变得困难。
2. 工厂方法模式应用场景与示例
应用场景:
工厂方法模式适合于产品种类较多或将来可能会扩展的场景。如果未来产品种类会频繁增加,使用工厂方法模式更加灵活。每个子类工厂类只负责创建某种特定的产品,符合开闭原则,即新增产品时不需要修改现有代码,只需增加新的工厂类。
示例:
继续以图形绘制系统为例,假设有多个工厂负责创建不同的形状:
解释:
– ShapeFactory
是一个抽象工厂类,它定义了一个抽象方法createShape()
,每个子类工厂(如CircleFactory
、SquareFactory
)负责实例化具体的图形对象。
– 客户端通过工厂类来创建具体产品,客户端与产品类之间没有直接的依赖关系。如果要新增其他形状(比如Triangle
),只需要创建新的工厂类(例如TriangleFactory
),并且无需修改客户端代码。
3. 简单工厂模式与工厂方法模式的区别
特点 | 简单工厂模式 | 工厂方法模式 |
---|---|---|
工厂角色 | 一个工厂类负责创建所有产品实例。 | 每个具体的工厂类负责创建某个具体产品实例。 |
扩展性 | 当新增产品时,需要修改工厂类,违反开闭原则。 | 新增产品时,只需要增加新的工厂类,不需要修改现有代码。 |
灵活性 | 不够灵活,所有的产品创建逻辑集中在一个类中,增加产品时会使工厂类变得庞大。 | 更加灵活,创建逻辑被分散在多个工厂类中,容易扩展。 |
使用场景 | 产品种类较少,变化不频繁的情况。 | 产品种类较多,且未来可能增加新产品的情况。 |
总结
- 简单工厂模式适用于产品种类较少且变化不频繁的场景。它通过一个工厂类来处理所有产品的创建。缺点是扩展性差,新增产品时需要修改工厂类,增加系统复杂性。
-
工厂方法模式适用于产品种类较多且经常扩展的情况。它将每个产品的创建委托给不同的工厂类,每个工厂类负责创建一个特定产品。这样扩展新的产品时,只需要新增对应的工厂类,而不需要修改现有代码,符合开闭原则。
在实际应用中,如果我们预计未来会增加很多产品,或者产品的创建逻辑比较复杂,选择工厂方法模式会更加灵活和易于维护。