简单工厂模式:
简单工厂模式不是设计模式中的一种,但是也比较常用,所以拿出来对比下。提取出来一个类单独创建各种各种的产品,而客户不需要知道这些具体的产品类,减少了创建对象的耦合。我们称这个类为工厂,工厂封装了创建产品的细节,以后如果产品的种类发生了变化,不再需要修改客户代码,而且工厂也可以被别的代码复用。
静态的工厂方法:
优点:不需要创建对象
-
缺点:不能通过继承还修改对象的行为
简单工厂模式在工厂类中包含了必要的判断逻辑,根据客户类的选择条件动态实例化相关的类,对客户端来说,去除了与具体产品的依赖。但是如果要再添加一种产品,需要给工厂类的分支中添加判断分支,需要修改之前的类,违背了开闭原则。
工厂方法模式:
工厂方法用来处理对象的创建,并将这样的行为封装在子类中。这样,客户代码中,关于超类的代码和子类对象创建代码解耦了.
工厂方法模式通过让子类来决定创建什么产品的方式,来达到将对象创建过程封装的目的。
如果产品体系在增加一种新产品时,不需要更改已有的代码,只需要改新增一个产品类和对应的工厂类。
其实在使用工厂方法模式中,使用哪一种工厂类,是由客户端选择的,客户端需要决定实例化哪一个工厂,选择判断的问题还是存在的。如果要添加功能,简单工厂模式是在工厂中修改,而工厂方法模式是在客户端修改。
工厂方法模式是简单工厂模式的进一步抽象和推广,克服了简单工厂违背开放-封闭原则的缺点,又保持了封装对象创建过程的优点。工厂方法的缺点是:每增加一个产品,都需要添加一个对相应的工厂类,增加了额外的开发量
抽象工厂模式:
抽象工厂模式提供一个接口,用于创建一系列相关或者相互依赖对象的家族,而不需要明确指定具体类。
抽象工厂允许客户使用使用抽象的接口来创建一组相关的产品,而不需要关心实际产出的具体产品是什么。这样一来,客户就从具体的产品中解耦了。
工厂方法模式和抽象工厂模式都是创建型设计模式,负责创建对象。
优点:
- 分离了具体的类
- 易于交换产品系列
- 有利于产品的一致性
缺点:
- 难以支持新种类的产品
区别:
- 工厂方法使用的方法是继承,而抽象工厂通过对象的组合作为一个产品集合。但是产品集合新增一个产品,就修妖对接口进行修改,抽象工厂的所有子类都要发生变化,违背了开闭原则。
- 使用场景不同,抽象工厂方法适用于需要创建一组相关产品或者想让制造相关产品集合起来的场景;工厂方法适用于不知道具体的子类,只知道抽象的产品