工厂方法模式

工厂方法模式用来定义一个创建产品的接口(抽象类),具体的产品创建工作由子类来实现,它是一种类的创建模式。

模式介绍

工厂方法模式分为4个角色:

1. 抽象工厂Creator,该角色定义了工厂类所必须具备的所有接口,在本模式中通常只有一个Creator角色类

2. 具体工厂ConcreteCreator,实际的工厂类,实现Creator中定义的接口并实际生成产品,应用将直接调用该角色以生成产品

3. 抽象产品角色Product,该角色定义了产品类所必须具备的接口

4. 具体产品角色ConcreteProduct,该角色实现了Product中定义的接口,它是应用所需要的真正的产品

上述角色中,一般具体工厂角色和具体产品角色一一对应,某个具体的产品由某个具体的工厂来创建。

为什么要用工厂方法模式

在可以应用简单工厂模式的场合,都可以使用工厂方法,简单工厂实际上可以说是工厂方法的简单版本。

具体的应用场合上来看,举个例子吧。

假设有个工厂F1生产一种产品P1,那么客户在使用产品时使用的方法是:

F1 f1 = new F1();
P1 p1 = f1.create();
..
Something.do(p1);
..
Other.do(p1);

如果客户又要用工厂F2生产的一种产品P2,那么客户就要大量的修改代码,包括Something和Other的方法签名都要修改成P2,这是一种巨大的负担。因此为了减轻这种负担,我们应该尽量少的修改代码实现,那么我们就抽象出P1和P2的抽象类P,抽象出F1和F2的抽象类F,那么上面的代码就变成了

F f = new F1();
P p = f.create();
..
Something.do(p);
..
Other.do(p);

客户需要用F2生产P2时,只需要修改最开始初始化的2句代码,把F1变成F2即可,最大化的减少了代码负担。

那么为什么要用工厂类来生产产品呢? 直接new产品类不行吗?

一般情况下,使用工厂类的原因一般是产品类有可能比较复杂,使用工厂类可以更好的组织产品,也使得产品类更加纯净,只做数据的保存即可。

原文地址:https://www.cnblogs.com/doomsword/p/2549964.html