设计模式之工厂方法模式

1. 核心思想

工厂方法模式(Factory Method Pattern)将对象的创建过程延迟到子类。具体来说,定义一个创建对象的接口(抽象工厂),但由子类决定实例化哪个具体类。这种方式解耦了对象的创建和使用,使系统更灵活、可扩展。
用大白话来说就是对象的接口就是USB接口,你要使用什么设备只要他是USB口的都可以接上去进行基本的使用。

2. 模式结构

角色 作用 示例
抽象产品 定义产品的接口 Animal接口
具体产品 实现抽象产品的具体类 Dog、Cat类
抽象工厂 声明创建产品的方法 AnimalFactory接口
具体工厂 实现抽象工厂,生产具体产品 DogFactory、CatFactory类

比如说抽象产品是油炸类,具体的产品就可以是炸豆腐,抽象工厂就可以是生产油炸食品,具体工厂就是生产炸豆腐工厂

3. 代码示例

PHP代码

php 复制代码
<?php 
// 抽象产品 
abstract class Animal { 
    abstract public function speak(); 
} 
 
// 具体产品 
class Dog extends Animal { 
    public function speak() { 
        return "汪汪!"; 
    } 
} 
 
class Cat extends Animal { 
    public function speak() { 
        return "喵喵!"; 
    } 
} 
 
// 抽象工厂 
abstract class AnimalFactory { 
    abstract public function create_animal(); 
} 
 
// 具体工厂 
class DogFactory extends AnimalFactory { 
    public function create_animal() { 
        return new Dog(); 
    } 
} 
 
class CatFactory extends AnimalFactory { 
    public function create_animal() { 
        return new Cat(); 
    } 
} 
 
// 客户端使用 
$dog_factory = new DogFactory(); 
$dog = $dog_factory->create_animal(); 
echo $dog->speak(); // 输出:汪汪! 
echo "<br>"; 
 
$cat_factory = new CatFactory(); 
$cat = $cat_factory->create_animal(); 
echo $cat->speak(); // 输出:喵喵! 
?> 

python代码

python 复制代码
# 抽象产品
class Animal:
    def speak(self):
        pass

# 具体产品
class Dog(Animal):
    def speak(self):
        return "汪汪!"

class Cat(Animal):
    def speak(self):
        return "喵喵!"

# 抽象工厂
class AnimalFactory:
    def create_animal(self):
        pass

# 具体工厂
class DogFactory(AnimalFactory):
    def create_animal(self):
        return Dog()

class CatFactory(AnimalFactory):
    def create_animal(self):
        return Cat()

# 客户端使用
dog_factory = DogFactory()
dog = dog_factory.create_animal()
print(dog.speak())  # 输出:汪汪!

cat_factory = CatFactory()
cat = cat_factory.create_animal()
print(cat.speak())  # 输出:喵喵!

Java代码

java 复制代码
// 抽象产品 
abstract class Animal { 
    public abstract String speak(); 
} 
 
// 具体产品:狗 
class Dog extends Animal { 
    @Override 
    public String speak() { 
        return "汪汪!"; 
    } 
} 
 
// 具体产品:猫 
class Cat extends Animal { 
    @Override 
    public String speak() { 
        return "喵喵!"; 
    } 
} 
 
// 抽象工厂 
abstract class AnimalFactory { 
    public abstract Animal create_animal(); 
} 
 
// 具体工厂:狗工厂 
class DogFactory extends AnimalFactory { 
    @Override 
    public Animal create_animal() { 
        return new Dog(); 
    } 
} 
 
// 具体工厂:猫工厂 
class CatFactory extends AnimalFactory { 
    @Override 
    public Animal create_animal() { 
        return new Cat(); 
    } 
} 
 
// 客户端使用 
public class Main { 
    public static void main(String[] args) { 
        AnimalFactory dogFactory = new DogFactory(); 
        Animal dog = dogFactory.create_animal();  
        System.out.println(dog.speak());   // 输出:汪汪! 
 
        AnimalFactory catFactory = new CatFactory(); 
        Animal cat = catFactory.create_animal();  
        System.out.println(cat.speak());   // 输出:喵喵! 
    } 
} 

4. 应用场景

复制代码
需要动态扩展产品类型:例如新增一种动物(如Bird),只需添加Bird类和BirdFactory类,无需修改现有代码。
系统需要解耦:客户端只需依赖抽象接口(Animal和AnimalFactory),不关心具体实现。

5. 优缺点对比

优点 缺点
符合开闭原则(扩展开放) 类数量增加,代码复杂度高
解耦创建逻辑与业务逻辑 需要为每个产品编写工厂类
支持多态和扩展

6. 对比简单工厂模式

简单工厂:一个工厂类集中创建所有产品(如AnimalFactory.create("Dog")),违反开闭原则。

工厂方法:每个产品对应一个工厂类,扩展时只需新增类,无需修改原有代码。

思维导图

相关推荐
阳光宅男@李光熠8 小时前
【电子通识】一起学习TDK的EMC基础——电池兼容设计方法概述
java·前端·数据库
张宜强8 小时前
025 安居租赁 · 房屋租赁平台
java·课程设计
Java_2017_csdn8 小时前
ReentrantLock 与 Redis RLock 对比解读
java
YDS8298 小时前
Small Spring IOC篇:实现 Bean 的定义、注册、获取
java·spring
边境悍匪8 小时前
蜗牛学苑 Java 智能体学习 Day45|Knife4j+SpringBoot3、书城项目整合 MyBatis 思维导图复盘
java·开发语言·vue.js·学习·spring
aixingpan8 小时前
aixingpan.cn API开发文档:api_docs_trichart_natal_progression_sec_transit2接口指南
前端·php
2601_962885729 小时前
A股数据源和 API 怎么选?(2026 全景选型指南 + 决策树)
python
需要8269 小时前
Arthas 一个命令排查线上问题
java·jvm·spring·spring cloud
Ticnix9 小时前
别再手动上线了:一条命令带备份、健康检查和自动回滚
后端·python·ci/cd
正经教主9 小时前
【FDE系列】阶段2:Day 32:多表查询 — JOIN 与聚合
人工智能·python·fde