【设计模式】工厂方法模式(Factory Method Pattern)

目录标题

  • 工厂方法设计模式详解
    • [1. 介绍](#1. 介绍)
    • [2. 结构](#2. 结构)
    • [3. 实现步骤](#3. 实现步骤)
      • [3.1 创建抽象产品接口](#3.1 创建抽象产品接口)
      • [3.2 创建具体产品类](#3.2 创建具体产品类)
      • [3.3 创建抽象工厂接口](#3.3 创建抽象工厂接口)
      • [3.4 创建具体工厂类](#3.4 创建具体工厂类)
      • [3.5 客户端使用](#3.5 客户端使用)
    • [4. 好处与优点](#4. 好处与优点)
    • [5. 坏处与缺点](#5. 坏处与缺点)
    • [6. 适用场景](#6. 适用场景)
    • [7. 总结](#7. 总结)

工厂方法设计模式详解

1. 介绍

工厂方法模式是一种创建型设计模式,它定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。这样,工厂方法模式让一个类的实例化延迟到其子类。在Java中,工厂方法模式经常用于创建对象,使得客户端代码不需要直接依赖具体的类,而是依赖于接口或抽象类。

2. 结构

工厂方法模式的主要结构包括以下几个角色:

  • 抽象产品(Product):定义产品的接口,是具体产品类的父类或者是接口。
  • 具体产品(ConcreteProduct):实现抽象产品接口,是工厂方法模式中具体创建的对象。
  • 抽象工厂(Creator):定义一个创建产品对象的方法,返回一个抽象产品对象。
  • 具体工厂(ConcreteCreator):实现抽象工厂接口,具体负责创建具体产品对象。

3. 实现步骤

下面以一个简单的示例来说明工厂方法模式的实现过程,假设我们有一个形状(Shape)接口和两个具体形状类:圆形(Circle)和正方形(Square)。

3.1 创建抽象产品接口

java 复制代码
// Shape.java
public interface Shape {
    void draw();
}

3.2 创建具体产品类

java 复制代码
// Circle.java
public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("画一个圆形");
    }
}

// Square.java
public class Square implements Shape {
    @Override
    public void draw() {
        System.out.println("画一个正方形");
    }
}

3.3 创建抽象工厂接口

java 复制代码
// ShapeFactory.java
public interface ShapeFactory {
    Shape createShape();
}

3.4 创建具体工厂类

java 复制代码
// CircleFactory.java
public class CircleFactory implements ShapeFactory {
    @Override
    public Shape createShape() {
        return new Circle();
    }
}

// SquareFactory.java
public class SquareFactory implements ShapeFactory {
    @Override
    public Shape createShape() {
        return new Square();
    }
}

3.5 客户端使用

java 复制代码
// Client.java
public class Client {
    public static void main(String[] args) {
        ShapeFactory circleFactory = new CircleFactory();
        Shape circle = circleFactory.createShape();
        circle.draw();
        
        ShapeFactory squareFactory = new SquareFactory();
        Shape square = squareFactory.createShape();
        square.draw();
    }
}

4. 好处与优点

松耦合:工厂方法模式将客户端代码与具体产品的实现分离,使得客户端不需要知道具体产品的类名,只需关注抽象产品和工厂接口。

扩展性强 :通过新增具体工厂和产品类,可以轻松扩展系统,符合开闭原则。

符合单一职责原则:每个具体工厂只负责创建一种具体产品,符合单一职责原则。

5. 坏处与缺点

类数量增多:每个具体产品都需要对应一个具体工厂,当产品种类较多时,类的数量会增加。

增加系统复杂度:引入了更多的类和接口,增加了系统的复杂度,适用于较复杂的场景。

6. 适用场景

工厂方法模式适用于以下场景:

  1. 当一个类不知道它所需要的对象的类时,可以使用工厂方法模式,让子类决定创建的具体对象。
  2. 当一个类希望由它的子类来指定它所创建的对象时,可以使用工厂方法模式。

7. 总结

工厂方法模式是一种常见且实用的设计模式,通过定义工厂接口和具体工厂类,将对象的创建延迟到子类中实现,从而提高了代码的灵活性和扩展性。在设计系统时,根据具体需求选择合适的设计模式能够提高代码的可维护性和可扩展性。

相关推荐
敲代码的 蜡笔小新2 小时前
【行为型之策略模式】游戏开发实战——Unity灵活算法架构的核心实现策略
unity·设计模式·c#·策略模式
_yingty_2 小时前
Java设计模式-策略模式(行为型)
java·设计模式·策略模式
炎芯随笔12 小时前
【C++】【设计模式】生产者-消费者模型
开发语言·c++·设计模式
workflower19 小时前
使用谱聚类将相似度矩阵分为2类
人工智能·深度学习·算法·机器学习·设计模式·软件工程·软件需求
枣伊吕波1 天前
第六节第二部分:抽象类的应用-模板方法设计模式
android·java·设计模式
lalajh1 天前
论软件设计模式及其应用
设计模式
lgily-12251 天前
常用的设计模式详解
java·后端·python·设计模式
Auc242 天前
OJ判题系统第4期之判题机模块架构——设计思路、实现步骤、代码实现(工厂模式、代理模式的实践)
java·spring cloud·log4j·mybatis·代理模式·工厂模式
周努力.2 天前
设计模式之中介者模式
设计模式·中介者模式
yangyang_z2 天前
【C++设计模式之Template Method Pattern】
设计模式