工厂模式是创建型模式,它的作用是创建对象。具体来说,常见的工厂模式包括简单工厂模式,工厂方法模式和抽象工厂模式三种。
简单工厂模式(Simple Factory Pattern)
角色定义:
工厂类
工厂类通常包含一个静态方法(类方法),由该方法根据输入类型负责创建具体的产品(对象)。
抽象产品基类(接口)
它的作用是降低客户端和具体产品之间的耦合度。而且符合了开闭原则,以后需要加入新车型,客户端调用的代码也基本无需修改。
具体产品类
真正实现业务逻辑的子类。
解决的问题:
工厂模式的核心思想在于:
- 通过引入工厂类,使对象的创建和使用分离了。这样的好处是它们可以独立的变化,易维护和扩展。
- 客户端依赖抽象基类(接口),而不是具体的类,降低了耦合度。
适用的场景:
- 有一组相似的对象,需要集中统一创建时。
- 创建对象的过程较为复杂时。
- 对象很多,并且有扩展需求时。
- 客户端不需要知道创建对象的过程时。
- 客户端使用的对象存在变动的可能,或者根本不知道使用哪一个具体对象时。
工厂方法模式(Factory Method Pattern)
简单工厂方法有两个缺点:
1.工厂类只有一个,且静态的工厂方法无法由子类继承,所以工厂的扩展受到限制。
2.工厂方法里除了创建对象的代码,还有大量的判断逻辑(if-else)混在里面,方法会变得越来越臃肿。
角色定义:
抽象工厂类、具体工厂子类
工厂方法模式在简单工厂模式的基础上演变为抽象出一个工厂父类,然后用不同的工厂子类来生成各自的产品。
该模式下产品和工厂的可扩展性都增强了,但是也随之而来的是可能会出现工厂类过多的问题。一般可以和简单工厂模式结合使用。
抽象工厂模式(Abstract Factory Pattern)
工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个抽象产品类。抽象工厂模式里每个工厂都会生产多种产品,但不同工厂生产的产品属于不同的系列。抽象工厂模式可以用来解决多产品族的问题。
角色定义:
产品族:
产品族可以理解为产品系列。举个例子,现代简约风格的家具,包括桌子沙发茶几是一个产品系列;中式古典风格的桌子沙发茶几是另一个产品系列。抽象工厂模式就是用不同的工厂来生产不同系列下的一组产品。
再举个该模式常被应用的例子:App修改主题(换肤)。App界面是由各种UI控件组成的,每个主题下同样的控件会有不同的样式。不同主题的工厂会生产各自样式的控件。变换主题时只要加载需要的主题工厂就可以了。
解决的问题:
- 将一个系列的产品族统一到一起创建。
- 容易改变产品的系列。
适用的场景:
需要创建一组对象,并需要切换不同的系列时。
缺点:
- 增加新的产品种类困难,它需要修改抽象工厂的接口。
- 代码结构比较复杂。