工厂方法模式用来定义一个创建产品的接口(抽象类),具体的产品创建工作由子类来实现,它是一种类的创建模式。
模式介绍
工厂方法模式分为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产品类不行吗?
一般情况下,使用工厂类的原因一般是产品类有可能比较复杂,使用工厂类可以更好的组织产品,也使得产品类更加纯净,只做数据的保存即可。