一文搞懂设计模式--工厂方法

72 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第20天,点击查看活动详情

工厂方法(Factory Method)

介绍

工厂方法模式,又称工厂模式、多态工厂模式,通过定义工厂父类负责定义创建对象的公共接口,而子类负责生成具体的对象。

工厂方法使一个类的实例化延迟到工厂类的子类(具体工厂)中完成,由子类来决定应该实例化(创建)哪一个类。

类图

image-20221018203909044

实例

抽象汽车接口

public interface AbstractCar {
    void run();
}

汽车实现类

public class BenchiCar implements AbstractCar{
    @Override
    public void run() {
        System.out.println("我是奔驰,我可以跑跳着跑!");
    }
}
​
​
public class WulingCar implements AbstractCar{
    @Override
    public void run() {
        System.out.println("我是五菱,我能飞!");
    }
}

工厂接口

public interface AbstractCarFactory {
​
    AbstractCar newCar();
}

工厂实现类

public class BenciCarFactory implements AbstractCarFactory{
    @Override
    public AbstractCar newCar() {
        return new BenchiCar();
    }
}
​
public class WulinCarFactory implements AbstractCarFactory{
    @Override
    public AbstractCar newCar() {
        return new WulingCar();
    }
}

会员端

public class Client {
    public static void main(String[] args) {
        AbstractCarFactory wulinCarFactory = new WulinCarFactory();
        AbstractCarFactory benciCarFactory = new BenciCarFactory();
​
        AbstractCar wuling = wulinCarFactory.newCar();
        wuling.run();
​
        AbstractCar benci = benciCarFactory.newCar();
        benci.run();
​
    }
}
​
我是五菱,我能飞!
我是奔驰,我可以跑跳着跑!

总结

一图胜千言

image-20221019231035866

1.使用的场景?

  • 当一个类不知道它所需要的对象的类时

  • 当一个类希望通过其子类来指定创建对象时

利用面向对象的多态性和里氏代换原则(继承父类,而不是去改变父类),在程序运行时,子类对象将覆盖父类对象(多态),从而使得系统更容易扩展。

2.本质是什么?

  • 延迟到子类来选择实现。
  • 工厂方法把创建对象的工作延迟到子类(具体工厂)来实现,它是先抽象出一个工厂,然后在实现类(子类)中选择实现

3.它解决了什么问题?

  • 解决了简单工厂模式的缺点,即工厂一旦需要生产新产品就需要修改工厂类的方法逻辑,这样就违背了开闭原则

4.它体现了设计模式中什么原则?

  • 依赖倒置,要依赖于抽象,而不是依赖于具体的实现(面向接口编程)。
  • 开闭原则,对修改关闭,对扩展开放。有新的产品了,不需要对工厂类(具体实现)修改。而是直接重写实现工厂接口,写新的逻辑即可。

5.存在的缺陷?

  • 添加新产品时,除了增加新产品类外,还要提供与之对应的具体工厂类,类的增多,在一定程度上增加了系统的复杂度;
  • 一个具体工厂只能创建一种具体产品

6.你认为与它相关的设计模式有哪些? 它们之间的区别有哪些?

  • 工厂方法模式和模板方法模式
  • 这两个模式外观类似,都是有一个抽象类,然后由子类来提供一些实现,**但是工厂方法模式的子类专注的是创建产品对象,
  • 模板方法模式的子类专注的是为固定的算法骨架提供某些步骤的实现。(提供实现步骤)
  • 这两个模式可以组合使用,在模板方法模式里面,使用工厂方法来创建模板方法需要的对象。

7.开源架构中哪些使用了这一模式?

后续更新.........