工厂模式的角色:工厂和产品
工厂模式的优点:将创建某一类对象的任务交给对应的工厂类统一管理,构建对象体系。
一、简单工厂
一座简单的工厂,生成各种产品,产品之间是有联系的。
角色:具体工厂、抽象产品和具体产品。
特点:只有一座工厂,调度者将需求作为参数发送给工厂,工厂根据不同的参数提供不同的对象。
缺点:
1、增加产品时,需要改动整座工厂,修改工厂的生产方法。
2、产品体系庞大时,工厂的职责过重。
二、工厂方法:
角色:抽象工厂、具体工厂、抽象产品、具体产品
![](/qrcode.jpg)
特点:根据产品的类型,将工厂的职责进行了划分,例如:刀具由相应的刀厂生产,枪械由对应的枪厂进行生产。
调度者需要长刀或者匕首时,将需求发送给刀厂,需要狙击枪或者步枪则发送给枪厂。
维护性提高了,一座工厂出了问题不影响其他的工厂。
缺点:增加(抽象的)产品例如弓箭时,需要增加一个相应的弓箭工厂,使得类的数量加倍。
三、抽象工厂
看到工厂方法,已经觉得很妙了。然而利用抽象工厂还可以构建更庞大复杂的体系,来解决实际问题。
可以引入品牌的概念来理解抽象工厂,同种产品可能会有不同的品牌,不同的品牌就会对应不同的厂商。
假设你想开一家新的武器厂,想让别人使用你的产品,而作为武器厂,就应该具备生产所有武器的能力。
所以在抽象工厂中规定:武器厂必须生产的武器有刀和枪等,那么此时你的武器厂只需要继承抽象工厂,提供你工厂生产的武器。
此时的产品结构就变成了下图这样。
如果想要更加抽象的话,例如不想开武器厂,只想开刀厂或枪厂,那么结构也许变成这样:
两个概念:
(1)产品等级:同一产品的不同品牌
(2)产品族:同一品牌的不同产品
特点:如果调度者(客户端)希望使用某一品牌的系列产品,或者某品牌工厂的产品对其他品牌的产品不能一起使用的话,则可以选择抽象工厂模式。
产品等级易扩展,已知的产品类型只需要新增品牌即可。
缺点:产品族难扩展,比如想增加弓箭,则必须在抽象工厂和对应的具体工厂中增加对应的生产方法。