图解设计模式: 有趣的工厂模式

图解实例:Java 23种设计模式深入解析 设计模式是软件工程领域中的一套最佳实践,它们是为了解决软件设计中常见问题而被广泛认可和应用的通用模板。设计模式不仅能够帮助开发者编写可读性更强、更易维护的代码,而且能够通过减少设计上的缺陷来降低软件开发的复杂性。本章将从设计模式的基础知识讲起,进而深入探讨其背后的概念,以及它们如何在不同场景下提高软件设计的质量。设计模式通常分为三种类型:创建型模式:涉及对象实例化的机制,以提供一种创建对象的最佳方式。结构型模式:关注如何将对象和类组合成更大的结构,并同时保持结构的灵活和高效。 阅读详情

工厂模式 Factory Method

在工厂模式中 父子类的关系就像是生产工厂中模具一样, 由父类负责指定实例生成的方式 子类来决定生成具体的类. 具体的处理全部交给子类负责,目的就是为了将生产实例的框架和负责实例生产类解耦

示例程序

从下面这段示例来看看工厂模式到底能为我们做些什么。

类列表

image-20221219192835521

framwork包
产品类

在framework包里 定义了产品,也就是说实现了这个类的对象都可以成为产品 他们都可以被使用

public abstract class Product {
    public abstract void use();
}

工厂类

在framework中同样定义了工厂, 工厂类用来创造产品和注册产品

public abstract class Factory {
    public final Product create(String owner) {
        Product product = createProduct(owner);
        registerProduct(product);
        return product;
    }

    protected abstract Product createProduct(String owner);

    protected abstract void registerProduct(Product product);
}
IDCard包
id卡

id卡继承产品类 来体现我们框架分离的目的

public class IDcard extends Product {

    private String owner;

    IDcard(String owner) {
        System.out.println("制作" + owner + "的ID卡");
        this.owner = owner;
    }

    @Override
    public void use() {
        System.out.println("使用" + owner + "ID卡.");
    }

    public String getOwner() {
        return this.owner;
    }
}

IDCardFactory

继承工厂类 用来生产产品和注册产品。

public class IDCardFactory extends Factory {
    private List owners = new ArrayList();

    @Override
    protected Product createProduct(String owner) {
        return new IDcard(owner);
    }

    @Override
    protected void registerProduct(Product product) {
        owners.add(((IDcard) product).getOwner());
    }

    public List getOwners() {
        return owners;
    }
}

测试
public class Test {
    public static void main(String[] args) {
        IDCardFactory factory = new IDCardFactory();
        Product card1 = factory.create("小红");
        Product card2 = factory.create("小明");
        Product card3 = factory.create("小刚");
        card1.use();
        card2.use();
        card3.use();

    }
}

image-20221219195521751

工厂模式的角色

在工厂模式中 我们将编写的包分离开来了,一个为framework(框架) 一个为具体的实现

这两个包的内容是平行的 如下图

类图

image-20221219195837240

Product角色

这个角色属于框架的类型 ,它定义了工厂方法中生成的实例所持有的api 具体的处理由继承了product的角色来决定

Creator创建者

Creator 也是属于框架的类型 他负责生成产品对象的抽象类,具体如何去生成由继承创建者的子类去决定

ConcreteProduct具体的产品

属于加工的类型 他决定了生成什么样的。

ConcreteCreator(具体的创建者)

ConcteteCreator 角色属于具体加工的乙方,他负责生辰具体的产品。

拓展思路

框架与加工

支持 我们分别学习了框架与具体加工这两方面的内容 他们被分别的封装到两个包中。

我们可以用相同的框架闯江湖其他的产品和工厂, 如我们要创建电视机 和 创建电视机的工厂类,这个时候我们就需要在框架保重编写电视机包

这里我们不需要修改框架包中的代码 只需要去修改对应的实现类就行了

生成实例 方法的三种实现方式

在工厂包中的生成产品方法是抽象方法 也就是需要在子类中实现这个方法, 创建产品的实现方式一般有三种

  • 指定一个抽象方法
  • 实现默认的处理 如果自类没有实现方法 将会默认处理
  • 在处理的其中抛出异常
使用模式与开发的小Tips

在日常开发中 使用模板方法或者是工厂模式的时候,因为要多读多个类的代码,缕清逻辑变得格外的重要,通常在设计模式设计子类的时候 需要想维护这些类的人员传达明确意图,擅自修改可能会出现事故

拓展实例

给产品增加id(以100开始) 并且希望 id和产品名存储在一个对应结构

我们只需要改动具体的实现就可以了

public class IDcard extends Product {

    private String owner;
    private int idNum = 100;

    IDcard(String owner, int idNum) {
        System.out.println("制作" + owner + "(" + idNum + ")" + "的ID卡");
        this.owner = owner;
        this.idNum = idNum;
    }

    @Override
    public void use() {
        System.out.println("使用" + owner + "(" + idNum + ")" + "的ID卡");
    }


    public String getOwner() {
        return this.owner;
    }

    public int getIdNum() {
        return idNum;
    }
}

public class IDCardFactory extends Factory {
    //private List owners = new ArrayList();

    Map<Integer, String> idcard = new HashMap();
    private int idNum = 100;

    @Override
    protected synchronized Product createProduct(String owner) {
        return new IDcard(owner, idNum++);
    }

    @Override
    protected void registerProduct(Product product) {
        idcard.put(((IDcard) product).getIdNum(), ((IDcard) product).getOwner());
    }

    public Map<Integer, String> getIdcard() {
        return idcard;
    }

    //public List getOwners() {
    //    return owners;
    //}
}

image-20221219202704384

我们可以发现 我们没有改动使用的方式也没有改动框架,只是修改了实现就可以完成效果的变化,可见设计模式的思路精妙

设计模式详解:抽象工厂模式实战与图解 抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,其核心目标是为一组相关或相互依赖对象的创建提供统一的接口,而无需指定它们的具体类。这种模式特别适用于多产品族、多等级结构的系统设计,例如跨平台的应用程序界面组件库(如 Windows 和 macOS 下的不同按钮、文本框实现)。相较于简单工厂或工厂方法模式,抽象工厂更强调产品族的一致性控制,即同一工厂创建的所有产品都属于同一个主题或平台。 阅读详情

相关推荐

告别卡顿闪烁!在Cesium 1.134中集成SOG格式,让400万高斯秒级加载

本文详细介绍了如何在Cesium 1.134中集成SOG格式,实现400万高斯数据的秒级加载,解决传统加载方式导致的卡顿和闪烁问题。通过空间索引重构、属性量化编码和WebGPU原生支持等技术,SOG格式显著提升了三维地理空间可视化的性能。文章还提供了环境准备、模型转换和Cesium集成的实战指南,帮助开发者高效优化项目。

weixin_29313817的博客 497

PHP简单工厂模式(simple factory)趣味讲解

简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式。简单工厂模式是由一个工厂对象决定创建出那一种产品类的实例。 1.工厂模式的几种形态 工厂模式专门负责将大量有共同接口的类实例化。工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类。工厂模式有以下几种形态: (1)简单工厂(Simple Factory)模式,又称静态工

精彩人生 656

保姆级教程:用YOLOv5s搞定钢材表面缺陷检测,从数据集NEU-DET到模型部署全流程

本文提供了一份详细的YOLOv5s钢材表面缺陷检测教程,涵盖从NEU-DET数据集处理到模型部署的全流程。针对工业环境中的实际限制,如计算资源有限和标注样本少等问题,提供了优化方案和实用技巧,帮助开发者快速实现高效的钢材缺陷检测系统。

weixin_30568591的博客 463

23种设计模式UML类图图解

目录 一 、类图的表示二、创建者模式1、单例模式2、简单工厂模式3、工厂方法模式4、抽象工厂模式5、原型模式6、建造者模式 三、结构型模式1、代理模式2、适配器模式3、装饰者模式4、桥接模式5、外观模式6、组合模式7、享元模式 四、行为型模式1、...

qq_40274514的博客 3万+

Solidworks二次开发(C# .NET API):从零构建装配体与虚拟零件

本文详细介绍了使用C#进行Solidworks二次开发,从零构建装配体与虚拟零件的完整流程。通过.NET API实现设计自动化,涵盖环境搭建、核心对象模型、虚拟零件创建与外部化保存等关键技术,帮助工程师将重复性建模工作程序化,大幅提升设计效率与标准化水平。

alice7model的博客 607

微磁模拟实战指南:从OOMMF安装到首个3D模型运行

本文详细介绍了OOMMF微磁模拟软件的安装与使用,从环境配置到首个3D模型运行的完整教程。涵盖Windows、Linux和macOS平台的安装避坑指南,以及MIF文件编写、并行计算优化等实战技巧,帮助研究人员快速掌握这一开源工具在磁畴壁运动、磁滞回线等微磁学问题中的应用。

weixin_29294597的博客 153

韩顺平图解Java设计模式

今天分享一部设计模式相关的视频,好好复习帮助还是很大的。课程介绍1) 优秀的程序应该是这样的:阅读时,感觉很优雅;新增功能时,感觉很轻松;运行时,感觉很快速,这就需要设计...

嘟爷java超神学堂 3223

【计算机三级-数据库技术】操作题大题(第1套)

从触发器的语法中可知,【1】处应该填写的是执行触发器的表,【2】处应该填写指定在表或视图上执行哪些数据修改语句时将激活触发器的关键字。使用FOR或AFTER选顶定义的触发器为后触发器,即只有在引发触发器执行的语句中的操作都已成功执行,并且所有的约束检查也成功完成后,才执行触发器。转换成新的独立的模式,模式的属性由联系本身的属性及两个实体的键构成,主键由两端实体的键组合而成。实体的转换:在从ER图转换为关系模式时,一个实体转换成一个关系模式,实体的属性就是关系模式的属性,实体的键就是关系的主键。

放纵小开爱的博客 1101

图解Java设计模式之工厂模式

图解Java设计模式之工厂模式简单工厂模式 简单工厂模式 看一个具体的需求 看一个披萨的项目 :要便于披萨种类的扩展,要便于维护 1)披萨的种类很多(比如GreekPizz、CheesePizz等) 2)披萨的制作有prepare、bake、cut、box 3)完成披萨店订购功能。 ...

不一样的花朵的博客 631

PX4从放弃到精通(二十七):固定翼姿态控制

固件版本 PX4 1.13.2欢迎交流学习,可加左侧名片。

超维空间科技的博客 6885

27、视网膜血管识别与分类的数据集和验证过程

本文介绍了视网膜血管自动识别与分类方法所使用的数据集及其验证过程。通过30张高分辨率的近红外反射视网膜图像,结合专业医生的手动标注结果,构建了包含597个血管段的基准数据集。研究采用准确率、召回率、F1分数和混淆矩阵等评估指标对模型进行验证,并提出了特征增强和分类器优化策略以提升性能。实验结果显示,该方法在复杂区域具有较强的鲁棒性和较高的准确性,为临床应用提供了可靠的依据。

i7j8k9l的博客 148

图解 java 设计模式(二)——彻底弄明白单例模式,工厂模式

1、图解 java 设计模式(二)——彻底弄明白单例模式,工厂模式 1.1、前言 大家可以去 b 站观看韩老师的视频:b站韩老师视频链接 1.2、设计模式介绍 1.2.1、基本介绍 设计模式是程序员在面对同类软件设计问题所总结出来的有用的经验,模式不是代码,而是某类问题的通用解决方案,设计模式(Design Pattern)代表了最佳的实践。这些解决方案是众多软件开发人员经过相当长的时间的试验和错误总结出来的。 设计模式的本质提高 软件的维护性,通用性和扩展性,并降低软件的复杂度。 设计模式的本质提高 软

qq_42279295的博客 4526

游戏客户端开发工程师部分笔试题解析

你可以选择任意连续K个宝石合并成一个新的宝石,新宝石保持在原队列的位置且它的能量值是这K个宝石能量值之和。给定一个幸运值N=0、一堆包含能量值的宝石,你的任务是找到将所有宝石合并成一个宝石的最大幸运值。2.在一个二维网格中,有一个起点S、一个终点E和一个必须经过的中间点M。C++ 的多态性正是通过基类指针或引用调用派生类覆盖的虚函数实现的,这是运行时多态的核心机制。光线追踪带来的抗锯齿效果是其渲染方法的自然结果,而不是一个独立的算法。宝石具体能量值:[10, 7, 2, 6, 5, 11, 8];

博客 3027

图解设计模式:23设计模式类图整理

最近把《图解设计模式》又翻了一遍,为了方便记忆,将里面的类图和一些要点整理了一下。 设计模式在Gof中的分类: 创建型 Abstract Factory(抽象工厂) Builder (建造者) Factory Factory(工厂模式) Singleton(单例) Prototype(原型模式) 结构型 Ada...

flyeva00的博客 3565

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

2.5万字详解23种设计模式—创建型模式(简单工厂、工厂方法、抽象工厂、单例-多线程安全详解、建造者、原型)的详细解读、UML类图、及代码演示

经学习于多位网上大佬并结合自己的感悟和理解,本文简述了各大设计模式,并通过UML和代码详细说明了创建型模式: ①简单(静态)工厂:升级版本,再升级版本,多方法工厂共四种实现方式。 ②工厂方法 ③抽象工厂 ④单例模式:饿汉式、懒汉式、加锁懒汉式、DCL单例----双重锁高性能(面试重点!)、静态内部类、枚举单例、升级版静态内部类、容器式单例、ThreadLocal单例共九种实现方式。 ⑤原型模式:浅拷贝和深拷贝 ⑥建造者模式:传统的build模式和build模式变种...

qq_41889508的博客 12万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Java 设计模式之工厂模式:对象创建的艺术(含 UML 图解)

工厂模式是Java中经典的创建型设计模式,通过封装对象创建过程实现"创建与使用分离"。文章介绍了三种工厂模式:1)简单工厂模式:通过一个工厂类根据参数创建不同产品,实现简单但违反开闭原则;2)工厂方法模式:为每个产品创建对应工厂类,遵循开闭原则但增加复杂度;3)抽象工厂模式:创建产品族,适合复杂系统但扩展性受限。文中通过计算器、日志记录器等代码示例,结合UML图解,详细阐述了各模式的实现方式、适用场景及优缺点。工厂模式能有效降低耦合、提高扩展性和统一管理对象创建,是Java开发中的重要设

三两肉的博客 1112

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

图解23种设计模式

图解23种设计模式创建型模式:1、单例模式2、工厂模式结构型模式:行为型模式: 创建型模式: 1、单例模式 单例(Singleton)模式的定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式。例如,Windows 中只能打开一个任务管理器,这样可以避免因打开多个任务管理器窗口而造成内存资源的浪费,或出现各个窗口显示内容的不一致等错误。 单例模式有 3 个特点: 1、’单例类只有一个实例对象; 2、该单例对象必须由单例类自行创建; 3、单例类对外提供一个访问该单例的全局访问点。 单例模式的结构与实

weixin_45429720的博客 3483

《图解设计模式》 学习笔记

《图解设计模式》学习笔记

一名不专业的“咖啡豆研磨师“ 1119

设计模式--六种创建型模式

前言   每几种模式之间都有一定的联系,从中发现它们的相同点和不同点,研究发生改变的节点,这就是本篇博客所要说明的创建型设计模式之间的联系。它们包括:简单工厂模式、单例模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式。 创建型模式的基本理解 创建型模式抽象了实例化过程。它们帮助一个系统独立于如何创建、组合和表示它的那些对象。 一个类创建型模式使用继承改变被实例

冯浩月 9638

图解设计模式

面向对象语言设计中,设计模式可以说是其中的精华了。今天抽出点时间,将设计模式再梳理一下。由于主客观条件限制,理解可能存在一些误差,欢迎有不同意见的朋友相互交流探讨,共同进步。 设计模式分为三个大类: 结构型,创建型,行为型; 一.创建型设计模式 1.理解: 我对创建型设计模式理解是: 对象的生成方式。 2.创建型之 工厂模式: 1).图解 2).理解: 核心...

automannn 1204

【Java设计模式】抽象工厂

文章目录概述适用场景优点缺点抽象工厂 -- 产品等级结构与产品族演示 概述 定义:抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口 扩展:无须指定它们具体的类 类型:创建型 抽象工厂能够将一组具有同一主题和单独的工厂封装起来,在正常使用中,客户端程序创建抽象工厂的具体实现,然后使用抽象工厂作为接口来创建这一主题的具体实现,我们不需要关心内部方法中获得对象的具体类型, 因为我们的客户端对象仅使...

明月沉江春雾晓 5752

设计模式之模板模式和工厂模式

模板模式和工厂模式的类别分类为“交给子类”,即两种设计模式都是通过子类来实现具体的功能。主角是子类,而不像上次的适应设计模式,主角是连接器。这种差别着重体现在我们在工业设计中对需求的不同理解和实现。 以下例子选自《图解设计模式》 一,模板模式 概念 模板模式定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。这种算法...

lishinho的博客 5354

设计模式概述与图解

1)对于数据类型是基本数据类的成员变量,浅拷贝会直接进行值传递,也就是将该属性值复制一份给新的对象。2)对于数据类型是引用数据类型的成员变量,比如说成员变量是某个数组、某个类的对象等,那么浅拷贝会进行引用传递,也就是只是将该成员变量的引用值(内存地址)复制一份给新的对象。因为实际上两对象的该成员变量都指向同一个实例。在这种情况下,在一个对象中修改该成员变量会影响到另一个对象的该成员变量值3)前面的克隆羊是浅拷贝4)浅拷贝是使用默认的clone()方法来实现。

皮球 1473

【白话设计模式】23种设计模式一句话通俗讲解,女朋友都能听懂(导航篇)

设计模式专栏,导航篇

公号:一条coding 1万+

深入浅出设计模式【三、抽象工厂模式】

抽象工厂模式是一种创建型设计模式,用于创建一组相关或依赖的对象(产品族)而不指定具体类。它通过抽象工厂接口提供创建方法,由具体工厂实现不同产品族的创建逻辑(如现代风格/古典风格UI组件)。该模式解耦客户端与具体产品,确保产品一致性,支持产品族切换。适用场景包括多风格UI系统、跨平台组件等需要保证产品一致性的情况。实现方式包括经典接口实现和反射配置化,建议优先使用依赖注入框架(如Spring)作为现代最佳实践。主要优势是产品族一致性,但扩展新产品类型时需修改工厂接口。

NeoLshu的博客 1241
上一篇: 图解设计模式:Teamplate Method 模板方法模式 由子类实现具体内容的模式
下一篇: Spring Aop 底层责任链思路实现
冷环渊
博客等级 码龄7年 1130粉丝 176原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冷环渊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值