设计模式之工厂方法模式

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")),违反开闭原则。

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

思维导图

相关推荐
1.14(java)几秒前
掌握数据库约束:确保数据精准可靠
java·数据库·mysql·数据库约束
SunnyDays10111 分钟前
如何使用 Python 将 ODT 转换为 PDF:完整指南
python·odt转pdf
Codeking__4 分钟前
Redis——value的数据类型与单线程工作模型
java·数据库·redis
人道领域6 分钟前
【零基础学java】(等待唤醒机制,线程池补充)
java·开发语言·jvm
名字不好奇9 分钟前
在C++中 如何实现java中的Stream
java·c++
智算菩萨9 分钟前
【Python自然语言处理】基于NLTK库的英文文本词频统计系统实现原理及应用
开发语言·python·自然语言处理
alonewolf_9910 分钟前
Tomcat整体架构深度解析:从设计精髓到实战应用
java·架构·tomcat
摩西蒙12 分钟前
阿里云 MaxCompute(原 ODPS)定时任务查询库存快照场景
java·大数据·sql·database
黎雁·泠崖13 分钟前
Java入门之吃透基础语法:注释+关键字+字面量+变量全解析
java·开发语言·intellij-idea·intellij idea
短剑重铸之日14 分钟前
《7天学会Redis》Day 1 - Redis核心架构与线程模型
java·redis·后端·架构·i/o多路复用·7天学会redis