区别:工厂方法里面产品分为抽象基类和一个具体实现的子类;而抽象工厂将具体实现子类进行了模块化的细分,有多个抽象产品类 ,具体工厂类能创建多个具体产品类的实例。
我从一下几个方面来理解抽象工厂和工厂方法不同点
- 抽象工程关键在于产品之间的抽象关系,所以至少要两个产品;工厂方法在于生成产品,不关注产品间的关系,所以可以只生成一个产品。
- 抽象工厂中客户端把产品的抽象关系理清楚,在最终使用的时候,一般使用客户端(和其接口),产品之间的关系是被封装固定的;而工厂方法是在最终使用的时候,使用产品本身(和其接口)。
抽象工厂更像一个复杂版本的策略模式,策略模式通过更换策略来改变处理方式或者结果;而抽象工厂的客户端,通过更改工厂还改变结果。所以在使用的时候,就使用客户端和更换工厂,而看不到产品本身。
工厂方法目的是生产产品,所以能看到产品,而且还要使用产品。当然,如果产品在创建者内部使用,那么工厂方法就是为了完善创建者,从而可以使用创建者。另外创建者本身是不能更换所生产产品的。
- 抽象工厂的工厂是类;工厂方法的工厂是方法。
抽象工厂的工厂类就做一件事情生产产品。生产的产品给客户端使用,绝不给自己用。
工厂方法生产产品,可以给系统用,可以给客户端用,也可以自己这个类使用。自己这个类除了这个工厂方法外,还能有其他功能性的方法
其实仔细想想,这个两个模式是有交集的,在极端的情况下,这两个模式其实是一样的。所以可以这样理解
- 给工厂方法模式加一个客户端,除了客户端都不用这个创建者。这个时候创建者就是工厂类了。(单一产品的特定关系这个时候就是没有关系)
- 抽象工厂模式中,在客户端内部编程时候,就可以把工厂类当作创建者。