面向对象设计模式之工厂模式

工厂模式的角色:工厂和产品

工厂模式的优点:将创建某一类对象的任务交给对应的工厂类统一管理,构建对象体系。

一、简单工厂

一座简单的工厂,生成各种产品,产品之间是有联系的。

角色:具体工厂、抽象产品和具体产品。

特点:只有一座工厂,调度者将需求作为参数发送给工厂,工厂根据不同的参数提供不同的对象。

缺点:

1、增加产品时,需要改动整座工厂,修改工厂的生产方法。

2、产品体系庞大时,工厂的职责过重。

二、工厂方法:

角色:抽象工厂、具体工厂、抽象产品、具体产品

特点:根据产品的类型,将工厂的职责进行了划分,例如:刀具由相应的刀厂生产,枪械由对应的枪厂进行生产。

调度者需要长刀或者匕首时,将需求发送给刀厂,需要狙击枪或者步枪则发送给枪厂。

维护性提高了,一座工厂出了问题不影响其他的工厂。

缺点:增加(抽象的)产品例如弓箭时,需要增加一个相应的弓箭工厂,使得类的数量加倍。

三、抽象工厂

看到工厂方法,已经觉得很妙了。然而利用抽象工厂还可以构建更庞大复杂的体系,来解决实际问题。

可以引入品牌的概念来理解抽象工厂,同种产品可能会有不同的品牌,不同的品牌就会对应不同的厂商。

假设你想开一家新的武器厂,想让别人使用你的产品,而作为武器厂,就应该具备生产所有武器的能力。

所以在抽象工厂中规定:武器厂必须生产的武器有刀和枪等,那么此时你的武器厂只需要继承抽象工厂,提供你工厂生产的武器。

此时的产品结构就变成了下图这样。

如果想要更加抽象的话,例如不想开武器厂,只想开刀厂或枪厂,那么结构也许变成这样:

两个概念:

(1)产品等级:同一产品的不同品牌

(2)产品族:同一品牌的不同产品

特点:如果调度者(客户端)希望使用某一品牌的系列产品,或者某品牌工厂的产品对其他品牌的产品不能一起使用的话,则可以选择抽象工厂模式。

产品等级易扩展,已知的产品类型只需要新增品牌即可。

缺点:产品族难扩展,比如想增加弓箭,则必须在抽象工厂和对应的具体工厂中增加对应的生产方法。

猜你喜欢

转载自blog.csdn.net/qq_42864422/article/details/108890338