定义:
定义一个工厂类,它可以根据参数的不同生成对应的类的实例;被创建的类的实例通常有相同的父类。因为该工厂方法尝尝是静态的,所以又被称为静态工厂方法(Static Factory Method)
结构图:
- Factory:工厂类,工厂模式的核心。负责创建所有产品实例的内部逻辑,被外界直接调用,返回抽象类Product.
- Product:抽象产品类,封装了各种产品的公有方法,利于提高系统的可扩展性。
- ConcreteProduct:具体产品类,工厂创建目标。继承或实现了抽象产品类的抽象方法,含有具体产品功能的执行逻辑。
注意:
- 传统情况下客户端会直接调用工厂类的静态方法,并指定对应的参数。如果需要更改对应的产品,则需要重新变音。因此可以考虑引入配置文件来指定具体产品类。
- 有时为了简化,可以将抽象产品类和工厂类合并,在抽象产品类中实现静态工厂方法。
优点:
- 工厂类将对象的创建和使用分类开来,符合了单一职责原则。
- 客户端无序知道具体产品的类名,只需要知道具体产品类对应的参数即可,隐藏了具体产品创建的细节。
- 通过配置文件,可以在不修改客户端代码的情况下更换和增加新的具体产品类。
缺点:
- 工厂类集中了所有的具体产品创建的职责,一旦不能使用,整个系统将无法使用。
- 如果添加新类,则需要修改工厂类,当产品类型多时,不利于整个系统的扩展和维护。
- 使用了静态方法,造成工厂角色无法形成基于继承的等级结构。
适用场景:
- 具体产品类的数目比较少,创建逻辑比较简单。
- 客户端只需要知道传入工厂的参数,对于如何创建对象并不关心。
实例: