🔥 核心
一个工厂能够根据需要产生不同的产品。
如果是根据参数生产产品,则称为简单工厂模式;定义一个创建对象的工厂接口,其子类自己已经决定好了生产哪一种产品,则称为工厂模式;这个子类工厂能生产一套产品。则称为抽象工厂模式。
🙁 问题场景
你开发了一款物流管理系统。最初的版本是为卡车运输设计的,所以大部分代码都是针对名为卡车
的类写的。
一段时间后,这款应用非常受欢迎,许多海运公司也向你抛出橄榄枝。
这是个好消息。可是…大部分代码都是针对卡车运输
类写的,这时又需要新加入一个轮船运输
类…
这时,你又接到了多家航空公司的电话…
🙂 解决方案
工厂方法的一个显著特征是,创建对象时,不使用new,而是调用工厂方法。这并不意味着我们不使用new,而是将new的位置放到了工厂方法当中。
我们把工厂方法看成一个工厂,并把它能够产生的对象称为产品,一个工厂能够根据需要产生不同的产品。不知道你有没有发现一个问题:工厂可以返回多种类型的产品,那这个工厂方法的返回值类型是什么?没错,工厂中的所有产品,必须具有相同的父类或接口。
好啦!回到刚刚的情景,你接到了海运公司的订单请求。
仔细想一想,卡车运输(TruckTransport)
和 轮船运输(ShipTransport)
都是运输方式,因此让它们都实现接口 运输方式(Transport)
,且它们各自都实现了运输接口的抽象方法 装货(load)
和 卸货(unload)
。
这时,你只需要坐在办公室里,看着窗外的运输工厂。工厂根据不同的订单,生产并开始一个个 卡车运输
和 轮船运输
。而你的物流管理系统需要在意究竟使用的是哪种运输方式吗?不需要,它只知道这次的 运输方式
可以 装货
和 卸货
即可进行统一的管理。
这时,空运公司又打来了电话。
你从容的按下了接听键。因为你知道,物流管理系统的代码几乎不需要什么大费周章的扩展,你只需要给你的运输工厂加一个switch分支即可!
🌈 有趣的例子
圆形(Circle)
、正方形(Square)
、三角形(Triangle)
均实现了 图形(Shape)
接口,它们是三种产品。
图形工厂(ShapeFactory)
可以根据传入值(CIRCLE、SQUARE、TRIANGLE)返回不同的产品。
三种图形的接口
interface Shape {
void draw();
}
圆形
class Circle implements Shape {
@Override
public void draw(