创建型 简单

工厂方法模式

Factory Method Pattern

定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

概述

工厂方法模式是一种创建型设计模式,它提供了一种将实例化逻辑委托给子类的方式。这样可以在不修改现有代码的情况下引入新类型的产品。

适用场景

  • 当一个类不知道它所必须创建的对象的类时
  • 当一个类希望由它的子类来指定它所创建的对象时
  • 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化时

优点

  • +避免了创建者和具体产品之间的紧密耦合
  • +单一职责原则:将产品创建代码放在一个地方,使代码更容易维护
  • +开闭原则:无需更改现有客户端代码,就可以在程序中引入新的产品类型

缺点

  • 代码可能变得更加复杂,因为需要引入许多新的子类
  • 可能需要修改客户端代码以支持新的具体创建者类

结构

classDiagram class Product { <<interface>> +use() } class ConcreteProductA { +use() } class ConcreteProductB { +use() } class Creator { <<abstract>> +factoryMethod() Product +operation() } class ConcreteCreatorA { +factoryMethod() Product } class ConcreteCreatorB { +factoryMethod() Product } Product <|.. ConcreteProductA Product <|.. ConcreteProductB Creator <|-- ConcreteCreatorA Creator <|-- ConcreteCreatorB Creator ..> Product : creates ConcreteCreatorA ..> ConcreteProductA : creates ConcreteCreatorB ..> ConcreteProductB : creates style Product fill:#fff3e0,stroke:#f57c00,stroke-width:2px,stroke-dasharray: 5 5 style Creator fill:#e8f5e9,stroke:#388e3c,stroke-width:2px style ConcreteProductA fill:#e3f2fd,stroke:#1976d2 style ConcreteProductB fill:#e3f2fd,stroke:#1976d2 style ConcreteCreatorA fill:#f3e5f5,stroke:#7b1fa2 style ConcreteCreatorB fill:#f3e5f5,stroke:#7b1fa2

交互演示

点击不同工厂创建对应的产品
Creator(抽象类)
extends
creates
等待创建...
Product A 类型
Product B 类型

生活类比

工厂方法就像是现实世界中的各种工厂和生产线

餐厅点餐

你去餐厅点餐,只需要告诉服务员你想吃什么(接口),具体由哪个厨师(子类)来做、怎么做,你不需要关心。

物流公司

物流公司提供运输服务,根据客户需求选择卡车、轮船或飞机来运输,客户只需要知道货物会被运输即可。

代码实现

Example.java

实际应用

Java Collection Framework

Java 中的 Iterator 方法就是一个工厂方法,不同的集合类型返回不同的迭代器实现。

Example.java

Spring Framework

Spring 中的 FactoryBean 接口允许开发者自定义 Bean 的创建逻辑。

Example.java

练习

1

工厂方法模式的核心思想是什么?