emmm......之所以写这个系列,是因为想去进阶,感觉写自己代码不够精简,亢沉臃肿;想写好写优雅写优秀,却不知道是不是优秀,模棱两可的感觉;想去入手源码,却不知道从拿下手,又或者说看不懂,为什么这么写。所以想入手设计模式系列,当然这些理解或者示例代码是建立在《大话设计模式》——程杰著的基础之上的。感觉这本书还是值得推荐的_
如果你之前没有接触过工厂模式的话,建议你先看这篇:简单工厂模式
对于工厂模式来讲,工厂模式细分为:简单工厂,工厂方法模式,抽象工厂,本篇主要讲解工厂方法模式,以及与简单工厂模式的区别。
先说结论:
简单工厂类似一种自己指挥别人作事情,而工厂方法模式则是自己做事情。
工厂方法模式相对于简单工厂模式来说前者对代码的浸入率更少,利于拓展。
简单工厂模式:
在具体讲解之前,我们先来看一组UML图:
可以看出,简单工厂是通过一个含参的工厂方法可以实例化任何产品,逻辑都放到了工厂类中,而工厂类是起到了关键作用;因此,我们可以总结出来简单工厂的特点:
优点
- 通过简单工厂模式,我们实现了对象的创建和使用的分离 (创建是在工厂类创建的,使用时在客户端);
- 在增加新产品情况下无需修改客户端代码,提高了系统的灵活与拓展性; (好比我增加一个幂运算,可以不用修改客户端代码,只需添加响应的类以及在工厂类增加响应的方法);
缺点
- 工厂类承担的责任太重,模块与模块之间耦合,一旦工厂类出现问题,整个系统都瘫痪了;
- 由于在新增产品的时候,工厂类还需要修改,这就违反了开放——封闭原则(对扩展是开放的,而对修改是封闭的)
适用情况:一般用于小项目或者具体产品很少扩展的情况(这样工厂类才不用经常更改)。
正是由于简单工厂存在这样的缺点,所以我们引入了工厂方法模式
工厂方法模式
工厂方法的UML图
而工厂方法中,对于逻辑的处理放回到了客户端(让用户选择new实例),用户只需关注增加新产品的类。
优点
- 工厂方法模式就很好的减轻了工厂类的负担,把某一类/某一种东西交由一个工厂生产;
- 符合开放——封闭原则;
缺点
- 不适合处理产品族的情况;
工厂方法部分代码实现:
-
创建工厂接口
public interface IFactory { MetaData createMetaData(); }
-
具体实现类去实现这个接口
//加法工厂 public class IFactoryAdd implements IFactory { public MetaData createMetaData() { return new MetaDataAdd(); } } //减法工厂 public class IFactoryReduce implements IFactory { public MetaData createMetaData() { return new MetaDataReduce(); } } //乘法工厂 public class IFactoryMul implements IFactory { @Override public MetaData createMetaData() { return new MetaDataMul(); } } //除法工厂 public class IFactoryDivision implements IFactory { @Override public MetaData createMetaData() { return new MetaDataDivision(); } }
-
客户端实现
public class FactoryMethod { public static void main(String[] args) { IFactory factoryAdd = new IFactoryAdd(); MetaData addMetaData = factoryAdd.createMetaData(); String result = addMetaData.getResult(1, 2); System.out.println("最终结果为:"+result); } }
总结
简而言之,工厂方法模式与简单工厂模式的区别在于前者对代码的浸入率更少,利于拓展。
如果不使用工厂模式的话,也许代码会少很多——只需要处理业务逻辑,不使用封装多态继承。但是在后期可维护性上以及可扩展性上是非常差的,非常不灵活。所以我们还得多思考,优化代码。