前言
简单工厂模式,工厂方法模式和抽象工厂模式都是属于创建型设计模式,三个模式的变化只需我们掌握一个内功心法,就是在创建一个对象时,找出会变化的地方,把它们从不变的部分分离出来,将可变的部分留作接口。即哪里变化,封装哪里,以达到最大程度上的复用。究竟用哪种设计模式更适合,这要根据具体的业务需求来决定
从以下几个方面来比较各自不同点。
适用情况
简单工厂:用来生产同一等级结构中已有产品的任意产品。(对于增加新的产品,无能为力)
工厂方法:用来生产同一等级结构中的任意产品。(支持增加新产品)
抽象工厂:用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)
这个系统有多于一个的产品族,而系统只消费其中某一产品族。同属于同一个产品族的产品是在一起使用的。
实现思路
简单工厂:模式中工厂为具体工厂,产品为抽象产品,由工厂实例创建产品实例。
工厂方法:模式中有抽象的工厂类,一种抽象的产品类,而工厂类中仅创建此抽象产品类的实例,具体产品实例由具体的工厂类创建。
抽象工厂:模式中创建多类产品,可将这些产品理解为一套相关的产品,由工厂在创建时一起创建,每类产品有不同的实例。实践中一般会用反射来创建工厂的实例,配合配置文件或依赖注入容器来避免创建不同产品时还需要修改客户端代码。
具体实现
简单工厂:用单独类来做创造实例的过程。
工厂方法:把工厂类抽象出一个接口,这个接口只有一个办法就是创建抽象产品的工厂方法。然后所有要生产具体类的工厂就去实现这个接口。
抽象工厂:需要提供一个用来创建整个家族的抽象类型。这个类型的子类定义了产品被生产的方法。要想使用这个工厂,必须先实例化它,然后将它传入一些针对抽象类型所写的代码中。
在抽象工厂的具体工厂中经常实现工厂方法来创建他们的产品。
总结
三者都是将对象创建封装起来,以便于得到更松的耦合,更有弹性的设计。实际应用中,根据我们的需求及可能的变化选择合适的模式。