- 简单工厂模式
一、定义:
定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。
因为在简单工厂模式用于创建实例的方法是静态方法,因此简单工厂模式又被称为静态工厂方法模式,它属于类创建型模式,使用方便,可以通过类名直接调用。满足“单一职责”原则。
二、结构图
三、包含角色
- 工厂角色类(Factory):
负责实现创建所有产品实例的内部逻辑,工厂类可以被外界直接调用,创建所需要的产品对象,在工厂类中提供了一个静态工厂方法用于获取产品。
工厂类根据工厂方法所传入的参数来动态决定应该创建哪一个产品类的实例。
- 抽象产品角色(Product):
是工厂类所创建的所有对象(具体产品)的父类,封装了各种产品对象的公有方法。Product提高系统的灵活性,使在工厂类只需定义一个通用的工厂产品方法,因为所有创建的具体产品都是其子类对象
- 具体产品角色(ConcreteProduct):
所有被创建的对象都充当这个角色的某个具体类的实例。
每一个具体产品角色都继承了抽象产品角色,需要实现在抽象产品中声明的抽象方法。
四、模式分析
- 步骤
1)定义抽象产品角色:
定义为抽象类/接口,封装各种产品对象的公有方法
2)定义具体产品角色:
实现/继承抽象产品角色,实现其中声明的方法
3)定义工厂角色:
提供静态获取具体产品方法,根据传入参数的不同返回不同的产品
七、优点
(1)分离职责:简单工厂模式实现了对象创建以及使用的分离,工厂类包含必要的判断逻辑,可以决定在什么时候创建什么哪一个产品的实例,客户端可以免除直接创建产品对象的职责,仅仅是“消费”产品
(2)简化记忆:客户端无须知道具体产品类的名字,只需要知道对应的参数即可。
(3)提高灵活性:可以引入配置文件在不修改客户端代码情况下增加新的具体产品类,提高灵活性
八、缺点
(1)工厂职责过重:工厂类集中了所有产品的创建逻辑,一旦不能正常工作,整个系统都要受影响
(2) 复杂度增加:由于引入了工厂类会增加系统中类的个数,会增加系统的复杂度和理解难度
(3)扩展困难:系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,在产品类型过多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护
(4)无法继承:简单工厂模式使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构
九、适用场景
工厂类负责创建的对象比较少,由于创建对象较少,不会造成工厂方法中的业务逻辑太过复杂
客户端只需要知道传入工厂类的参数,对如何创建对象不关心