主要用于创建对象,将对象的创建过程封装为类,将new的细节从表层隐藏起来,此为**“简单工厂”,其特点是内部包含了逻辑判断。这其实违反了“开放-封闭原则”**,在这一基础上进一步改进得到工厂方法模式。
定义一个用于创建对象的接口,[1]让子类决定实例化哪一个类。使一个类的实例化延迟到其子类。
-
让子类决定实例化
一个产品类对应一个工厂类,这些具体的工厂类都继承于同一接口;在产品变化时,只需要改变对应的工厂类即可,于此满足了“开放-封闭原则”。
要素
- 具体工厂类与具体产品类一一对应
- 所有具体工厂类继承于同一接口
- 客户负责选择具体工厂类
- 集中封装了对象的创建,每个工厂职责单一,符合高内聚的原则,降低了客户与产品对象之间的耦合。
- 满足了“开放-封闭原则”。
- 每新增一个产品就要新增一个产品工厂类,增加了额外的开发量。
- 自然语义与程序语义之间的逻辑判断由客户端实现(如“+”和add()之间)。
- 工厂方法所属的类不一定是工厂类(抽象工厂、建造者),它可能是一个普通类、一个框架类,甚至一个自由函数。
一般用于创建一类对象,为此提供了统一创建对象的接口,并提高了可维护性和可测试性。总的来说,以下场景非常合适:
- 创建一类对象,或工厂的职责较为单一时。
- 产品参数化维度较低时。
- 总的工厂创建其他工厂。