当前位置: 首页 > news >正文

工厂模式全解析:简单、方法、抽象工厂详解

一.简单工厂模式

1.定义

简单工厂模式是由一个工厂对象确定创建哪一种产品类的实例。适用于工厂类需要创建对象较少的场景,且客户端只需要传入工厂类的参数,对如何创建对象的逻辑不需要关心。不符合开闭原则

2.适用场景

  1. 工厂类负责创建的对象较少
  2. 客户端只需要传入工厂类的参数,对如何创建对象的逻辑不需要关心

3.缺点

工厂类的职责相对过重,不易于扩展过于复杂的产品结构

4.代码示例

// 产品接口
interface Product {void use();
}// 具体产品A
class ConcreteProductA implements Product {@Overridepublic void use() {System.out.println("Using Product A");}
}// 具体产品B
class ConcreteProductB implements Product {@Overridepublic void use() {System.out.println("Using Product B");}
}// 简单工厂类
class SimpleFactory {// 使用反射public Product createProduct(Class<? extends Product> clazz) {try {clazz.newInstance();}catch (Exception e) {e.printStackTrace();}return null;}
}// 客户端代码
public class Client {public static void main(String[] args) {SimpleFactory factory = new SimpleFactory();Product product = factory.createProduct(ConcreteProductA.class);product.use();}
}

二.工厂方法模式

1.定义

工厂方法模式是指定义一个创建对象的接口,让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行。符合开闭原则

2.适用场景

  1. 创建对象需要大量重复的代码
  2. 客户端不依赖于产品类实例如何被创建,实现等细节
  3. 一个类通过其子类来指定创建哪个对象

3.缺点

  1. 类的个数过多,增加复杂度
  2. 增加了系统的抽象性和理解难度

4.代码示例

// 抽象产品
interface Product {void use();
}// 具体产品A
class ConcreteProductA implements Product {@Overridepublic void use() {System.out.println("Using Product A");}
}// 具体产品B
class ConcreteProductB implements Product {@Overridepublic void use() {System.out.println("Using Product B");}
}// 抽象工厂
abstract class Creator {public abstract Product createProduct();
}// 具体工厂A
class ConcreteCreatorA extends Creator {@Overridepublic Product createProduct() {return new ConcreteProductA();}
}// 具体工厂B
class ConcreteCreatorB extends Creator {@Overridepublic Product createProduct() {return new ConcreteProductB();}
}// 客户端代码
public class Client {public static void main(String[] args) {Creator creatorA = new ConcreteCreatorA();Product productA = creatorA.createProduct();productA.use();Creator creatorB = new ConcreteCreatorB();Product productB = creatorB.createProduct();productB.use();}
}

三.抽象工厂模式

1.定义

抽象工厂模式是一种创建型设计模式,用于创建一系列相关或相互依赖的对象,而无需指定其具体类。它通过抽象接口定义一组工厂方法,每个方法负责生成一种产品,从而实现产品族的创建与具体产品类的解耦。不符合开闭原则

  • 产品族:指一组相关联的产品(如 “小米手机 + 小米耳机”、“苹果手机 + 苹果耳机”)。
  • 抽象工厂:定义创建产品族中各类产品的接口(如 “生产手机”、“生产耳机”)。
  • 具体工厂:实现抽象工厂接口,负责生产某一产品族的具体产品(如 “小米工厂” 生产小米手机和小米耳机)。
  • 抽象产品:定义产品的接口(如 “手机”、“耳机”)。
  • 具体产品:实现抽象产品接口的具体类(如 “小米手机”、“苹果耳机”)。

2.适用场景

  1. 系统需要处理多个产品族,且每次只使用其中一个产品族

  2. 产品族中的产品存在强关联性,必须组合使用

  3. 客户端无需关心产品的具体创建过程,只需依赖抽象接口

3.缺点

1.规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂的接口

2.增加了系统的抽象性和理解难度

4.代码示例

定义抽象产品接口

public interface Button {void render();
}public interface Checkbox {void render();
}

定义具体产品类

public class WindowsButton implements Button {@Overridepublic void render() {System.out.println("Render Windows button");}
}public class MacOSButton implements Button {@Overridepublic void render() {System.out.println("Render MacOS button");}
}public class WindowsCheckbox implements Checkbox {@Overridepublic void render() {System.out.println("Render Windows checkbox");}
}public class MacOSCheckbox implements Checkbox {@Overridepublic void render() {System.out.println("Render MacOS checkbox");}
}

定义抽象工厂接口

public interface GUIFactory {Button createButton();Checkbox createCheckbox();
}

定义具体工厂类

public class WindowsFactory implements GUIFactory {@Overridepublic Button createButton() {return new WindowsButton();}@Overridepublic Checkbox createCheckbox() {return new WindowsCheckbox();}
}public class MacOSFactory implements GUIFactory {@Overridepublic Button createButton() {return new MacOSButton();}@Overridepublic Checkbox createCheckbox() {return new MacOSCheckbox();}
}

客户端代码

public class Application {private Button button;private Checkbox checkbox;public Application(GUIFactory factory) {// 客户端仅通过抽象接口调用方法,不涉及具体产品或工厂的细节button = factory.createButton();checkbox = factory.createCheckbox();}public void render() {button.render();checkbox.render();}
}
http://www.dtcms.com/a/343351.html

相关文章:

  • comfyUI背后的一些技术——Checkpoints
  • leetcode_238 除自身以外的数组乘积
  • 图--常见面试问题
  • 面试可能问到的问题思考-Redis
  • 开源后台管理系统
  • 云蝠智能Voice Agent的多语言、多音色与语音克隆技术解析
  • 手动实现树形下拉菜单
  • 云原生俱乐部-RH294知识点归纳(2)
  • EEMD-LSTM模型择时策略 --- 1.EEMD分解与LSTM模型搭建
  • 开源,LangExtract-Python库用LLM从非结构化文本提取结构化信息
  • 生产环境的 MySQL 数据库能用 Docker 吗?
  • Spring面试宝典:Spring IOC的执行流程解析
  • ES_数据存储知识
  • 基于SpringBoot的宠物用品系统【2026最新】
  • odoo-063 pip 安装 Segmentation fault (core dumped),曲线救国
  • Vue3 + TypeScript全局阻止非输入区域的Backspace键,防止回退页面
  • Redis实战-基于Session实现分布式登录
  • 深度学习——yolo学习
  • AI模型部署 - 大语言模型(LLM)部署技术与框架
  • Android auncher3实现简单的负一屏功能
  • 基于YOLOv8-SEAttention与LLMs融合的农作物害虫智能诊断与防控决策系统
  • 运动数据采集如何帮助克里斯·凯尔飞跃迎面驶来的F1赛车
  • 基于IEEE-754浮点数格式的matlab仿真
  • Day24 目录遍历、双向链表、栈
  • Mac电脑 3D建模工具--犀牛Rhino
  • 【个人网络整理】NOIP / 省选 /NOI 知识点汇总
  • 视频孪生技术在城市政务数字化转型中的应用与价值探索
  • ES_映射
  • Nacos-10--认识Nacos中的Raft协议(Nacos强一致性的实现原理)
  • VirtualBox 安装 Ubuntu Server 系统及 Ubuntu 初始配置