【设计模式】简单工厂模式

文章目录

  • [1. 简单工厂模式简介](#1. 简单工厂模式简介)
  • [2. 核心概念](#2. 核心概念)
  • 3.代码示例
  • [4. 优点](#4. 优点)
  • [5. 缺点](#5. 缺点)
  • [6. 适用场景](#6. 适用场景)

1. 简单工厂模式简介

简单工厂模式(Simple Factory Pattern)是软件开发中常用的一种设计模式,属于创建型模式的一种。这种模式旨在提供一个创建对象的接口,但允许客户端决定哪个类实例化,将实例化的工作延迟到工厂类中完成。简单工厂并不属于《设计模式:可复用面向对象软件的基础》一书中的23种经典设计模式之一,但不代表这个设计模式不值得学习.

2. 核心概念

简单工厂模式的核心是一个被称为"工厂"的类,这个类负责根据传入的参数来决定创建并返回哪一个具体的产品类实例。这样做的好处是可以隐藏具体的创建逻辑,使得客户端代码不需要关心对象是如何被创建的,只需知道所需产品的类型即可。

简单工厂模式三个重要概念:

  • Factory(工厂类):这是简单工厂模式的核心,它包含一个静态方法,根据传入的参数创建并返回相应的具体产品对象。
  • Product(抽象产品类):定义了所有具体产品共有的接口或属性。
  • ConcreteProduct(具体产品类):实现抽象产品类的类,具体产品可以有多个,每个都实现了抽象产品定义的接口。

3.代码示例

例如: 有一个水杯抽象类,陶瓷杯和保温杯继承水杯这个抽象类,从而实现相应的方法. 并有一个工厂类来根据传入的参数决定到底创建的是哪个产品(陶瓷杯or保温杯)

java 复制代码
public class SimpleFactory {
    public static void main(String[] args) {
        Cup cup = Factory.createCup("ceramicCup");
        cup.show();
    }
}

class Factory {
    public static Cup createCup(String type) {
        Cup cup = null;
        if (type.equals("ceramicCup")) cup = new ceramicCup();
        else if (type.equals("thermalCup")) cup = new thermalCup();
        else System.out.println("没有对应的产品");
        return cup;
    }
}

// 水杯抽象类
abstract class Cup {
    public abstract void show();
}

// 陶瓷杯
class ceramicCup extends Cup {
    @Override
    public void show() {
        System.out.println("type : ceramicCup");
    }
}

// 保温杯
class thermalCup extends Cup {
    @Override
    public void show() {
        System.out.println("type : thermalCup");
    }
}

4. 优点

  1. 隔离复杂性:客户端无需了解产品类的创建细节,降低了模块间的耦合度。
  2. 易于交换产品系列:只需要修改工厂类的创建逻辑,就可以更换整个产品系列。

5. 缺点

  1. 违反开闭原则:添加新产品时需要修改工厂类的代码,这与开闭原则(对扩展开放,对修改关闭)相违背。
  2. 不适用于产品类较多的情况:如果产品种类过多,工厂类的判断逻辑会变得复杂,难以维护。

6. 适用场景

  • 当系统只需要创建少数几个对象,且客户端不需要知道创建逻辑时。
  • 客户端与具体产品类之间的耦合需要被降低,使得系统更灵活,比如在日志记录系统中,可以使用简单工厂模式根据配置动态创建不同的日志记录器。
相关推荐
纪莫16 分钟前
A公司一面:类加载的过程是怎么样的? 双亲委派的优点和缺点? 产生fullGC的情况有哪些? spring的动态代理有哪些?区别是什么? 如何排查CPU使用率过高?
java·java面试⑧股
JavaGuide1 小时前
JDK 25(长期支持版) 发布,新特性解读!
java·后端
用户3721574261351 小时前
Java 轻松批量替换 Word 文档文字内容
java
白鲸开源1 小时前
教你数分钟内创建并运行一个 DolphinScheduler Workflow!
java
晨米酱2 小时前
JavaScript 中"对象即函数"设计模式
前端·设计模式
Java中文社群2 小时前
有点意思!Java8后最有用新特性排行榜!
java·后端·面试
代码匠心2 小时前
从零开始学Flink:数据源
java·大数据·后端·flink
间彧2 小时前
Spring Boot项目中如何自定义线程池
java
间彧2 小时前
Java线程池详解与实战指南
java
用户298698530142 小时前
Java 使用 Spire.PDF 将PDF文档转换为Word格式
java·后端