作用:
    实现创建者与调用者的分离,

    实例化对象不使用new,用工厂方法代替,将调用者跟实现类解耦,调用者只需要给方法提供实例的抽象,而不需要关心实例具体是如何创建的,创建实例的具体细节由工厂类实现

    • 简单工厂模式
    • 工厂方法模式
    • 抽象工厂模式

    简单工厂模式(静态工厂模式)
    一个工厂可以创建多种实例,只需要通过创建方法传参(Class对象或者约定的字符串) 工厂模式 - 图1优点简单
    缺点实现不好违背开闭原则

    可以通过反射满足开闭原则

    1. class ProductFactory{
    2. public static IProduct getProduct(Class<? extends IProduct> clazz){
    3. try{
    4. if(clazz!=null){
    5. return clazz.newInstance();
    6. }
    7. }catch(Exception e){
    8. e.printStackTrace();
    9. }
    10. return null;
    11. }
    12. }

    工厂方法模式(多态性工厂模式)
    每一种实例都配置一个专属的工厂,一个工厂只能创建一种实例
    定义一个创建对象的接口,但由实现这个接口的类来决定实例化哪个类,工厂方法把类的实例化推迟到子类中进行。

    优点:符合开闭原则
    缺点:类膨胀
    image.png

    1. public interface IFactory {
    2. IProduct getProduct();
    3. static class MethodFactoryA implements IFactory {
    4. @Override
    5. public IProduct getProduct() {
    6. return new ProductA();
    7. }
    8. }
    9. static class MethodFactoryB implements IFactory {
    10. @Override
    11. public IProduct getProduct() {
    12. return new ProductB();
    13. }
    14. }
    15. }

    需要先实例化工厂,然后通过工厂对象创建对象

    工厂方法模式的缺点

    1. 灵活性增强,对于新产品的创建,只需多写一个相应的工厂类。
    2. 典型的解耦框架。高层模块只需要知道产品的抽象类,无须关心其他实现类,满足迪米特法则、依赖倒置原则和里氏替换原则。

    工厂方法模式的缺点

    1. 类的个数容易过多,增加复杂度。
    2. 增加了系统的抽象性和理解难度。
    3. 抽象产品只能生产一种产品,此弊端可使用抽象工厂模式解决。

    抽象工厂模式
    抽象工厂模式(Abstract Factory Pattern)指提供一个创建一系列相关或相互依赖对象的接口,无须指定它们具体的类。意思是客户端不必指定产品的具体类型,创建多个产品族中的产品对象。

    一个工厂生产一个产品族的产品
    image.png
    与工厂方法模式相比:

    • 工厂方法模式一个工厂只生产一类产品,而抽象工厂模式可以生产多中产品(产品族)
    • 抽象工厂模式横向扩展容易(新增产品族),符合开闭原则;纵向扩展困难(在产品族中增加新的产品),不符合开闭原则

    工厂方法模式完全符合开闭原则

    Spring的BeanFactory使用抽象工厂模式