详解设计模式:简单工厂模式

news2025/7/19 21:01:04

简单工厂模式(Smiple Factory Pattern):定义一个工厂类,他可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类,简单工厂模式也被称为静态工厂模式。

本篇内容包括:工厂模式 概述、关于 简单工厂模式、简单工厂模式 Demo。


文章目录

    • 一、工厂模式 概述
        • 1、工厂模式的使用场景
        • 2、工厂模式的分类
    • 二、关于 简单工厂模式
        • 1、关于 简单工厂模式
        • 2、关于 简单工厂模式的构成
        • 3、关于 简单工厂模式的实现
        • 4、关于 简单工厂模式的优缺点
    • 三、简单工厂模式 Demo
        • 1、Demo 设计
        • 2、Demo 实现
        • 3、Demo 测试


一、工厂模式 概述

工厂方法是一种十分常用的创建型设计模式,它在父类中提供了创建对象的接口但允许子类更改将要创建的对象的类型。

1、工厂模式的使用场景

在一些情况下,要创建的对象需要一系列复杂的初始化操作,比如查配置文件、查数据库表、初始化成员对象等,如果把这些逻辑放在构造函数中,会极大影响代码的可读性。不妨定义一个类来专门负责对象的创建,这样的类就是工厂类,这种做法就是工厂模式,在任何需要生成复杂对象的地方,都可以使用工厂模式。

2、工厂模式的分类

一般情况下,我们所提及的“工厂模式”会被细分为三种,即简单工厂、工厂方法和抽象工厂。而 GoF 的《设计模式》一书中,它将简单工厂模式看作是工厂方法模式的一种特例,所以工厂模式只被分成了工厂方法和抽象工厂两类。


二、关于 简单工厂模式

1、关于 简单工厂模式

简单工厂模式(Smiple Factory Pattern):定义一个工厂类,他可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类,简单工厂模式也被称为静态工厂模式。

简单工厂模式将产品的“消费”和“生产”完全分开,调用房,只需要自己需要什么产品,和如何使用就可以了,而对于产品的具体生产任务,则由工厂类来实现。

工厂类根据传进来的参数生产具体的产品供消费者使用。这种模式使得更加利于扩展,当有新的产品加入时仅仅需要在工厂中加入新产品的构造就可以了。

2、关于 简单工厂模式的构成

简单工厂的构成:

  • 具体的工厂角色(Factory):工厂角色即工厂类,他是简单工厂模式的核心,负责创建所有产品实例的内部逻辑;工厂类可以被外界直接调用,创建所需要的产品对象;在工厂类中提供进后台的工厂方法 factoryMethod(),它返回的产品类型为抽象的产品类型 Product。
  • 抽象的产品角色(Product):它是工厂类创建的所有对象的父类,封装了各种产品对象的公有方法,它的引入提高了系统的灵活性,使得在工厂类中只需要定义一个通用的工厂方法,因为所有创建的具体产品都是其子类对象。
  • 具体的产品角色(ConcreteProduct):简单工厂的创建目标,所有被创建的对象都充当这个角色的某个具体类的实例。每一个具体产品角色都集成了抽象产品角色,需要在实现在抽象产品中声明的抽象方法。

3、关于 简单工厂模式的实现

首先,根据具体产品进行抽象,将它们的公共的代码进行抽象和提取后,封装在一个抽象产品中;

其次,根据抽象产品,将各种不同对象的相关代码封装到不同的类中,这些类称为具体产品类,每一个具体产品都是抽象产品的子类;

然后,提供一个工厂类用于创建各种产品,在工厂类中提供一个创建产品的工厂方法,该方法可以根据传入的参数不同创建不同的具体产品对象;

最后,客户端只需要调用工厂类的工厂方法并传入响应的参数即可得到一个具体产品对象。

4、关于 简单工厂模式的优缺点

优点:客户端与产品的创建分离,客户端不需要知道产品创建的逻辑,只需要消费该产品即可。

缺点:工厂类集成了所有产品的创建逻辑,当工厂类出现问题,所有产品都会出现问题;还有当新增加产品都会修改工厂类,违背开闭原则


三、简单工厂模式 Demo

1、Demo 设计

# 角色

DemoFactory、DemoAbstractProduct、DemoProductA、DemoProductB

在这里插入图片描述

# 实现

DemoAbstractProduct 是作为产品角色的抽象父类,DemoProductA、DemoProductB 是作为产品角色的具体实现的子类。

DemoFactory 作为具体工厂角色,通过方法 factoryMethod(String productName) 根据 productName 返回对应的工厂。

2、Demo 实现

# DemoAbstractProduct 抽象产品类

//抽象产品类
public abstract class DemoAbstractProduct {
    //抽象产品方法
    public abstract sayHi();
}

# DemoProductA 具体产品类A

//继承抽象类实现产品A类
public class DemoProductA extends DemoAbstractProduct {
    
    //实现抽象产品方法
    @Overide
    public abstract sayHi(){
        System.out.println("Hi, I'm ProductA");
    }
}

# DemoProductB 具体产品类B

//继承抽象类实现产品B类
public class DemoProductB extends DemoAbstractProduct {
    
    //实现抽象产品方法
    @Overide
    public abstract sayHi(){
        System.out.println("Hi, I'm ProductB");
    }
}

# DemoFactory 产品工厂类

public class DemoFactory {
    
    public DemoFactory() {}
    
    //第一种写法
    //根据产品名称生产产品
    public DemoAbstractProduct factoryMethod(String productName) {
        DemoAbstractProduct product = NULL;
        switch(productName){
            case "A":
                product = new DemoProductA();//生产产品A
                break;
            case "B":
                product = new DemoProductB();//生产产品B
                break;
            default:
                break;
        }
        return product;
    }
}

3、Demo 测试

public class Client {
    public static void main(String[] args) {
        DemoAbstractProduct product;
        //通过工厂类创建具体产品对象
        product = DemoFactory.factoryMethod("A");
        product.sayHi();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/35929.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

若依(Ruoyi-Vue-Plus版)——1.登录(SaToken)

这里学习一下若依框架的一个扩展版本: RuoYi-Vue-Plus: 后台管理系统 重写RuoYi-Vue所有功能 集成 Sa-TokenMybatis-PlusJacksonXxl-JobSpringDocHutoolOSS 定期同步 (gitee.com) 官方文档:文档预览 - Gitee.com 项目有关SaToken登录写在最后&#xff0c…

论文阅读笔记 | 三维目标检测——SECOND算法

如有错误,恳请指出。 文章目录1. 背景2 网络结构2.1 3d Backbone2.2 Loss Compute2.3 Data Augment3. 实验结果paper:《SECOND: Sparsely Embedded Convolutional Detection》 1. 背景 鉴于VoxelNet等3d检测算法中使用的3d卷积会导致计算量大且推理速度…

智慧税务解决方案-最新全套文件

智慧税务解决方案-最新全套文件一、建设背景税务大数据现状和挑战1、数据割裂,外部数据整合不足,智能化应用不足2、缺乏统一治理,数据资产不清,质量不高3、数据获取效率低,数据冗余、查询效率低4、 运营运维体系不健全…

【Linux】---进程地址空间

文章目录什么是进程地址写时拷贝为什么要有进程地址为了保护物理内存更方便进行进程和进程数据的解耦统一视角操作系统怎么管理进程地址区域划分在之前学习C/C的时候都会提到 地址这个概念,我们写代码时创建变量,定义函数等都会有其对应的地址空间。而地…

成为数字游民,他们为何「All in Web3」?

成为数字游民,他们为何「All in Web3」? “早上好,夜之城。” 赛博朋克承载着一代人对未来世界的遐想。今年上映的「赛博朋克:边缘行者」中,主人公大卫面临着不夜城旧有制度的高压和控制,对旧有秩序不断发…

C++STL-string类的实现(下)

文章目录1. 流插入和流提取1.1 流插入1.2 流提取2. 现代写法的拷贝构造和赋值函数2.1 现代写法的拷贝构造2.1 现代写法的赋值函数3. string类的迭代器实现3.1 正向迭代器1. 流插入和流提取 1.1 流插入 可能有的同学会这样去写:以一个字符串形式来输出。还有的人会这…

《CTFshow - Web入门》03. Web 21~30

Web 21~30web21知识点题解web22知识点题解web23知识点题解web24知识点题解web25知识点题解web26知识点题解web27知识点题解web28知识点题解web29知识点题解web30知识点题解web21 知识点 tomcat 认证爆破burpsuite暴力破解(Sniper)之custom iterator使用…

用Numba:一行代码将Python程序运行速度提升100倍

用Numba:一行代码将Python程序运行速度提升100倍 在《用PyPy加速Python程序》中我们看到,PyPy通过JIT技术可以将Python的运行速度平均提高3-4倍。但即便是提升后,Python的执行速度依然无法与C/C/Rust同日而语。并且PyPy对Python程序的优化对…

【计算机毕业设计】33.快递取件预约系统源码

一、系统截图(需要演示视频可以私聊 摘 要 本论文主要论述了如何使用JSP技术开发一个快递取件预约系统,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论…

GEO振弦式钢筋计适用范围

适用范围 钢筋计:用于监测岩土工程混凝土建筑物的应力,适用于长期埋设在水工建筑物或其他建 筑物内部,测量结构物内部的钢筋应力。 锚杆应力计:钢筋计用于测量锚杆应力时,成为锚杆应力计。装上锚杆应力计的锚杆称…

Flink部署之Yarn

Flink部署之Yarn 一、环境准备 1、Flink 是一个分布式的流处理框架,所以实际应用一般都需要搭建集群环境。 需要准备 3 台 Linux 机器。具体要求如下: 系统环境为 CentOS 7.5 版本。安装 Java 8。安装 Hadoop 集群,Hadoop 建议选择 Hadoop…

ORB-SLAM2 ---- Tracking::TrackReferenceKeyFrame函数

目录 1.函数作用 2.步骤 3.code 4.函数解析 4.1 将当前帧的描述子转化为BoW向量 4.2 总体解释 1.函数作用 用参考关键帧的地图点来对当前普通帧进行跟踪。 2.步骤 Step 1:将当前普通帧的描述子转化为BoW向量 Step 2:通过词袋BoW加速当前帧与参考帧…

PG::Covfefe

nmap -Pn -p- -T4 --min-rate1000 192.168.205.10 nmap -Pn -p 22,80,31337 -sCV 192.168.205.10 先查看31337端口的robots.txt目录,几个隐藏文件未发现可利用的地方 dirb对31337路径的枚举中发现了.ssh 访问后发现存在私钥 下载id_rsa和id_rsa.pub 得知用户名为…

Vscode-Git graph怎么看?

VScode可以使用插件查看git提交图谱,这个图谱看起来眼花缭乱,今天花时间看懂了,在这里分享一下。 在Vscode插件中搜索git graph安装 打开git项目,在左下角可以看到git graph 在右侧可以看到按照时间分布的commit,代表…

Java JSP JAVAweb在线考试系统源码网上考试系统源码(ssm考试管理系统)

JSP在线考试系统源码网上考试系统源码(ssm考试管理系统)

PLC中ST编程的IF判断

如果判断条件是如果...否则...的时候; 如果wData的值是16进制的FFFF,十进制的65535;就执行IF中的语句,否则就执行ELSE中的; 当wData的值为0时,因不符合IF的判断条件,执行了ELSE中的语句&#x…

MySQL索引底层数据结构

索引简介 索引是一个排好序的数据结构,包含着对数据表里所有记录的引用指针,如下图所示。索引文件和数据文件一样都存储在磁盘中,数据库索引的目的是在检索数据库时,减少磁盘读取次数。 常见的索引数据结构包括二叉树、红黑树、…

node多版本控制

今天遇到一个问题: 下载了一个vue项目,一直卡在npm install阶段,折腾了半天,发现是版本太高了,需要降低一下版本,但是其他项目需要高版本的,这不就冲突了; 找到了一个node多版本控制…

基于SSM的亲子活动平台的搭建与实现(源码+数据脚本+论文+技术文档)

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问…

葡萄糖-聚乙二醇-刀豆球蛋白A,ConcanavalinA-PEG-Glucose

葡萄糖-聚乙二醇-刀豆球蛋白A,ConcanavalinA-PEG-Glucose 中文名称:葡萄糖-刀豆球蛋白A 英文名称:Glucose-ConcanavalinA 别称:刀豆球蛋白A修饰葡萄糖,ConA-葡萄糖 存储条件:-20C,避光&…