二、创建型(工厂方法模式)

news/2024/10/15 11:45:30/

工厂方法模式

概念
工厂方法模式是一种创建型设计模式,它定义了一个创建对象的接口,但由子类决定要实例化的类。工厂方法将实例化逻辑推迟到子类,使得代码更加灵活和可扩展。


应用场景

  1. 产品系列:当系统需要创建一系列相关或相互依赖的对象时,工厂方法模式非常适用。
  2. 解耦:当不希望在客户端代码中直接使用产品的具体类,而是希望通过接口或抽象类进行创建。
  3. 框架设计:在设计框架时,可以使用工厂方法模式提供接口,允许用户通过子类实现自定义的产品。
  4. 插件系统:通过工厂方法创建插件,使得插件可以在运行时被替换或扩展。

注意点

  • 扩展性:如果增加新产品,需要增加新的工厂类,但不需要修改已有代码。
  • 复杂性:引入工厂方法会增加系统的复杂性,特别是在简单的情况下,可能会显得过于冗余。
  • 避免过度设计:在简单场景下,可能不需要引入工厂方法,直接使用构造函数即可。

核心要素

  1. 产品接口:定义工厂方法所创建的产品的接口。
  2. 具体产品:实现产品接口的具体类。
  3. 工厂接口:定义一个创建产品的工厂接口。
  4. 具体工厂:实现工厂接口,负责实例化具体产品。

Java代码示例

// 产品接口
interface Product {void use();
}// 具体产品
class ConcreteProductA implements Product {@Overridepublic void use() {System.out.println("使用产品 A");}
}class ConcreteProductB implements Product {@Overridepublic void use() {System.out.println("使用产品 B");}
}// 工厂接口
interface Factory {Product createProduct();
}// 具体工厂
class ConcreteFactoryA implements Factory {@Overridepublic Product createProduct() {return new ConcreteProductA();}
}class ConcreteFactoryB implements Factory {@Overridepublic Product createProduct() {return new ConcreteProductB();}
}// 客户端
public class Client {public static void main(String[] args) {Factory factoryA = new ConcreteFactoryA();Product productA = factoryA.createProduct();productA.use();Factory factoryB = new ConcreteFactoryB();Product productB = factoryB.createProduct();productB.use();}
}

各种变形用法

  1. 简单工厂模式(静态工厂)
    不符合严格的工厂方法模式,但可以用静态方法来创建对象。

    class SimpleFactory {public static Product createProduct(String type) {switch (type) {case "A":return new ConcreteProductA();case "B":return new ConcreteProductB();default:throw new IllegalArgumentException("未知产品类型");}}
    }
    
  2. 抽象工厂模式
    提供一个创建一系列相关产品的接口,不仅仅是单一产品。

    interface AbstractFactory {Product createProductA();Product createProductB();
    }class ConcreteFactory implements AbstractFactory {@Overridepublic Product createProductA() {return new ConcreteProductA();}@Overridepublic Product createProductB() {return new ConcreteProductB();}
    }
    
  3. 多工厂模式
    结合多个工厂类,处理不同类型的产品。

    class MultiFactory {private Map<String, Factory> factoryMap = new HashMap<>();public void registerFactory(String type, Factory factory) {factoryMap.put(type, factory);}public Product createProduct(String type) {Factory factory = factoryMap.get(type);if (factory != null) {return factory.createProduct();}throw new IllegalArgumentException("未知产品类型");}
    }
    

这些是工厂方法模式的基本知识和变形用法!


http://www.ppmy.cn/news/1539416.html

相关文章

Linux操作系统小项目——实现《进程池》

文章目录 前言&#xff1a;代码实现&#xff1a;原理讲解&#xff1a;细节处理&#xff1a; 前言&#xff1a; 在前面的学习中&#xff0c;我们简单的了解了下进程之间的通信方式&#xff0c;目前我们只能知道父子进程的通信是通过匿名管道的方式进行通信的&#xff0c;这是因…

Go-知识依赖GOPATH

Go-知识依赖GOPATH 1. 介绍2. GOROOT 是什么3. GOPATH 是什么4. 依赖查找5. GOPATH 的缺点 1. 介绍 早期Go语言单纯地使用GOPATH管理依赖&#xff0c;但是GOPATH不方便管理依赖的多个版本&#xff0c;后来增加了vendor&#xff0c;允许把项目依赖 连同项目源码一同管理。Go 1.…

PL/SQL Developer如何连接Oracle数据库(汉化)

简介 PL/SQL Developer是一种用于Oracle数据库开发的集成开发环境&#xff08;IDE&#xff09;。它提供了一个可视化的界面&#xff0c;使开发人员能够方便地编写、调试和执行PL/SQL代码。PL/SQL Developer还具有其他功能&#xff0c;如数据库对象浏览器、SQL编辑器、数据导入…

P2056 [ZJOI2007] 捉迷藏 题解

P2056 [ZJOI2007] 捉迷藏 题面&#xff1a; 题目描述 Jiajia 和 Wind 是一对恩爱的夫妻&#xff0c;并且他们有很多孩子。某天&#xff0c;Jiajia、Wind 和孩子们决定在家里玩捉迷藏游戏。他们的家很大且构造很奇特&#xff0c;由 N N N 个屋子和 N − 1 N-1 N−1 条双向走廊…

【Vue】Vue3.0(十一)Vue 3.0 中 computed 计算属性概念、使用及示例

上篇文章&#xff1a;【Vue】Vue3.0&#xff08;十&#xff09;toRefs()和toRef()的区别及使用示例 &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;Vue专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年10月15日10点23分 文章目录 Vue 3.0中…

19 Shell Script awk命令

Shell Script awk命令 一、awk 一&#xff09;awk介绍 ​ awk是一个强大的文本分析工具&#xff0c;相对于grep的查找&#xff0c;sed的编辑&#xff0c;awk在其对数据分析并生成报告时&#xff0c;显得尤为强大。简单来说awk就是把文件逐行的读入&#xff0c;以空格为默认分…

docker方式k8s环境搭建及pod简介

目录 一 搭建环境准备 二 搭建步骤 三 pod简介 3.1 pod介绍 3.2 pod配置 3.3 pod生命周期 3.4 pod调度 一 搭建环境准备 1.1 关闭防火墙和selinux&#xff0c;有自己搭建好的harbor仓库 1.2 先禁用服务器的交换分区&#xff08;如果服务器内存不够&#xff0c;k8s使用交…

理解Token和Session:鉴权与会话管理的区别

理解Token和Session&#xff1a;鉴权与会话管理的区别 在Web应用和API设计中&#xff0c;鉴权与会话管理是两个核心概念&#xff0c;它们对于确保用户身份的安全性和维护用户会话状态至关重要。Token和Session是两种常用的鉴权与会话管理机制&#xff0c;它们各自具有独特的工…