设计模式——创建型模式

23种设计模式-创建型模式 工厂方法模式(Factory Method Pattern)是创建型设计模式的一种,它提供了一种创建对象的最佳方式。在工厂方法模式中,对象的创建是通过调用一个工厂方法而不是直接调用构造器来完成的。这个工厂方法可以是指定的接口并由子类实现,或者是类的抽象方法。定义工厂方法模式定义了一个创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。涉及到的关键类或接口Product(产品角色):定义工厂方法所创建的对象的接口。ConcreteProduct(具体产品角色) 阅读详情

设计模式——创建型模式

单例模式

概念:保证一个类仅有一个实例,并提供一个访问它的全局访问点

实现一:饿汉模式

在这里插入图片描述
饿汉在类加载时就完成了初始化,避免了多线程同步的问题,如果始终没有使用这个实例,就会造成内存浪费。

实现二:懒汉模式(线程不安全)

在这里插入图片描述
懒汉模式声明了一个静态对象,在用户第一次调用时初始化。在多线程时不能正常工作。

实现三:懒汉模式(线程安全)

在这里插入图片描述
这种写法在多线程中可以很好的工作,但是每次调用getInstance方法都需要同步,造成不必要的时间开销。

实现四:双重检查模式(DCL)

在这里插入图片描述
在方法内部进行了两次判空,第一次为了不必要的同步,第二次是在实例等于null的时候才创建,但是这样会出现DCL问题,如下图

正常情况下:
在这里插入图片描述
指令重排:

在这里插入图片描述

创建对象时会出现指令重排。

指令重排序可以保证串行语义一致,但是没有义务保证多线程间的语义也一致。也就是说上面3行伪代码的2和3之间虽然被重排序了,但是是不影响串行语义的。但是在多线程并发执行的情况就可能出现:

在这里插入图片描述
在这里插入图片描述
这样就很好想了:

当一个线程创建对象出现了指令重排,他执行了步骤1、3,此时另一个线程过来取单例去使用,但是这时对象创建的初始化工作还没有做,所有就会出现问题。

解决:使用volatile修饰对象

实现五:静态内部单例模式

在这里插入图片描述
第一次加载Singleton时,并不会初始化sInstance,只有在第一次调用getInstance方法时虚拟机加载SingletonHolder并初始化SInstance。这样保证了线程安全,也能保证Singleton类的唯一性。

实现六:枚举单例

在这里插入图片描述
默认枚举单例创建是线程安全的。并且在任何情况先都是单例。

上面的单例模式中有一种情况会重新创建对象——反序列化

将一个单例实例对象写到磁盘再读回来,从而获得了一个实例。
在这里插入图片描述
反序列化操作提供了readResolve方法,这个方法可以让开发人员控制对象的反序列化。在上述几个方法示例中,如果要杜绝单例对象被反序列化时重新生成对象。就需要加入如上代码。

实现七:容器实现

    class SingletonManager {
        private static Map<String, Object> objectMap = new HashMap<>();
        private SingletonManager() {}
        public static void registerService(String key, Object instance) {
            if (!objectMap.containsKey(key)) {
                objectMap.put(key, instance);
            }
        }
        public static Object getService(String key) {
            return objectMap.get(key);
        }
    }

将多种单例类注入到一个统一的管理类中,在使用是通过key获取对应类型的对象。

使用场景

在一个系统中,要求一个类有且仅有一个对象,它的具体使用场景如下:

  • 整个项目需要一个共享访问点或共享数据。
  • 创建一个对象需要耗费的资源过多,比如访问I/O或者数据库等资源。
  • 工具类对象。

简单工厂模式

又叫静态工厂方法模式。

简单工厂模式,其属于创建型设计模式,但是并不属于 23种GoF设计模式之一。提到它是为了让大家能够更好地理解后面讲到的工厂方法模式。

在简单工厂模式中有如下角色。

  • Factory:工厂类,这是简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。
  • IProduct:抽象产品类,这是简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
  • Product:具体产品类,这是简单工厂模式的创建目标。

简单实现

我们用生产计算机来举例,假设有一个计算机的代工生产商,它目前已经可以代工生产联想计算机了。随着业务的拓展,这个代工生产商还要生产惠普和华硕的计算机。这样我们就需要用一个单独的类来专门生产计算机,这就用到了简单工厂模式。下面我们来实现简单工厂模式。

抽象产品类Computer
在这里插入图片描述
具体产品类

创建各个品牌的计算机,其都继承了自己的父类Computer,并实现了父类的start方法。具体的计算机产品分别是联想、惠普和华硕计算机:
在这里插入图片描述
工厂类

创建一个工厂类,它提供了一个静态方法 createComputer 用来生产计算机。你只需要传入自己想生产的计算机的品牌,它就会实例化相应品牌的计算机对象,代码如下所示:
在这里插入图片描述
客户端调用

客户端调用工厂类,传入"hp"生产出惠普计算机并调用该计算机对象的 start 方法
在这里插入图片描述

使用场景及优缺点

使用场景

  • 工厂类负责创建的对象比较少。
  • 客户只需知道传入工厂类的参数,而无须关心创建对象的逻辑。

优点

  • 使用户根据参数获得对应的类实例,避免了直接实例化类,降低了耦合性。

缺点

  • 可实例化的类型在编译期间已经被确定。如果增加新类型,则需要修改工厂,这违背了开放封闭原则。简单工厂需要知道所有要生成的类型,其当子类过多或者子类层次过多时不适合使用。

工厂方法模式

定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法使一个类的实例化延迟到其子类。

工厂方法模式中有以下角色:

  • Product:抽象产品类。
  • ConcreteProduct:具体产品类,实现Product接口。
  • Factory:抽象工厂类,该方法返回一个Product类型的对象。
  • ConcreteFactory:具体工厂类,返回ConcreteProduct实例。

简单实现

工厂方法模式的抽象产品类与具体产品类的创建和简单工厂模式是一样的,具体在上面简单工厂。

创建抽象工厂:

抽象工厂里面有一个 createComputer 方法,想生产哪个品牌的计算机就生产哪个品牌的。

在这里插入图片描述
具体工厂

广达代工厂是一个具体的工厂,其继承抽象工厂,通过反射来生产不同厂家的计算机:

在这里插入图片描述
客户端调用

客户端创建了GDComputerFactor,并分别生产了联想、惠普和华硕计算机:
在这里插入图片描述

使用场景

在任何需要生成复杂对象的地方,都可以使用工厂方法模式。复杂对象适合使用工厂模式,用new就可以完成创建的对象无需使用工厂模式。

简单工厂和工厂方法

对于简单工厂,我们在工厂类中进行了必要的逻辑判断,根据不同的条件实例化相关的类。

除去了客户端与具体产品的依赖,但是带来了一个问题:如果我们需要添加产品就需要修改我们的工厂类,这违背了开放封闭原则。

而工厂方法模式就没有违背这个开放封闭原则。如果我们需要生产苹果计算机,则无须修改工厂类,直接创建产品即可。

建造者模式

将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

它允许用户不知道内部构建细节的情况下,可以精细的控制构造流程。

在建造者模式中有如下角色

  • Director:导演类,负责安排已有模块的顺序,然后通知Builder开始建造。
  • Builder:抽象Builder类,规范产品的组建,一般由子类实现。
  • ConcreteBulider:具体建造者,实现抽象 Builder 类定义的所有方法,并且返回一个组建好的对象。
  • Product:产品类。

简单实现

用DIY组装计算机的例子来实现一下建造者模式。

创建产品类

组装一台计算机,计算机被抽象为Computer类,它有3个部件:CPU、主板和内存,并在里面提供了3个方法分别用来设置CPU、主板和内存:

在这里插入图片描述
创建Builder类规范产品的组建

商家组装计算机有一套组装方法的模板,就是一个抽象的 Builder 类,其里面提供了安装CPU、主板和内存的方法,以及组装成计算机的create方法

在这里插入图片描述
商家实现了抽象的Builder类,MoonComputerBuilder类用于组装计算机

在这里插入图片描述

用导演类来统一组装过程

商家的导演类用来规范组装计算机的流程规范,先安装主板,再安装CPU,最后安装内存并组装成计算机:

在这里插入图片描述

客户端调用导演类

最后商家用导演类组装计算机。我们只需要提供自己想要的CPU、主板和内存就可以了,至于商家怎样组装计算机我们无须知道
在这里插入图片描述

使用场景及优缺点

使用场景

  • 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
  • 相同的方法,不同的执行顺序,产生不同的事件结果时。
  • 多个部件或零件都可以被装配到一个对象中,但是产生的运行结果又不相同时。
  • 产品类非常复杂,或者产品类中的调用顺序不同而产生了不同的效能。
  • 在创建一些复杂的对象时,这些对象的内部组成构件间的建造顺序是稳定的,但是对象的内部组成构件面临着复杂的变化。

优点

  • 使用建造者模式可以使客户端不必知道产品内部组成的细节。
  • 具体的建造者类之间是相互独立的,容易扩展。
  • 由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。

缺点

  • 产生多余的Build对象以及导演类。
设计模式-创建型模式 目的:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。应用场景:GUI工具包中,为不同的操作系统提供统一的界面元素创建机制。描述:提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们具体的类。核心思想:通过定义一个抽象层来创建一系列产品,而不是单一的产品。客户端代码使用的是由抽象工厂提供的接口,而不直接依赖于具体的产品类。优点:易于交换“系列产品”,因为具体工厂类在运行时被实例化;为大规模的产品设计提供了开放式的兼容性。// 抽象产品A// 具体产品A1。 阅读详情

相关推荐

设计模式之创建型5种

设计模式之所以被归纳为23种,而非其他数量,源于GoF(Gang of Four)在1994年的系统性总结和分类。

Marzlam的博客 1063

设计模式:建造者模式/生成器模式案例

建造者模式介绍和动机,模式结构的角色(5个),讲解时的例子:炸鸡店生产汉堡,鸡肉卷,果汁,可乐等,经过服务员的装配,形成多样的套餐,返回给顾客。该模式适用的环境,该模式的案例分析,代码实现,文件结构,案例描述为:计算机组装工厂可以将CPU,内存,硬盘,主机,显示器等硬件设备组装在一起构成一台完整的计算机,且构成的计算机可以是笔记本电脑,也可以是台式机,还可以是不提供显示器的服务器主机。对于用户来言,无需关心计算机的组成设备和组装过程,工厂返回给用户的是完整的计算机对象。

qq_48457459的博客 3945

代码的艺术之路——创建型设计模式

每种设计模式,不同于网上千篇一律的定义或模板代码,我都尽可能从解决工作实际问题出发,通过代码一步步演进最终的设计模式,每种设计模式都力求讲清其来龙去脉,并解剖出一些较为独特的想法和见解,望对诸君能有所帮助!

weixin_45479946的博客 1474

设计模式复习(五)-------建造者模式

1.定义 建造者模式可以将部件本身和它们的组装过程分开,关注如何一步步创建一个包含多个组成部分的复杂对象,用户只需要指定复杂对象的类型即可得到该对象,而无须知道其内部的具体构造细节。 将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。 —《设计模式》GoF 在软件系统中,有时候面临着“一个复杂对象”的创建工作,复杂对象由各个部分的子对象用一定的算法构成; 由于需求的变化,复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。 如何应对这种变化?

qq_41342326的博客 3396

SEED-VII 实战指南:如何利用多模态脑电图数据提升情感识别精度

本文提供了SEED-VII多模态脑电图数据集的实战指南,详细介绍了如何利用该数据集提升情感识别精度。内容涵盖数据获取、预处理、特征提取,以及构建多模态融合神经网络模型的关键步骤,并强调了被试者独立评估的重要性,为情感计算研究者提供了从数据到模型的全流程解决方案。

weixin_29196891的博客 317

Isaac Sim 使用经验(配置要求,云服务器)

Google Colab及AutoDL都是在docker内运行,其中google colab并不支持docker指令,而依照AutoDL的相关文档,AutoDL并不直接提供docker指令。2. Google Colab/AutoDL 不支持图形化界面,图形渲染等任务,所以没有办法使用Omniverse Streaming进行直播,从而更好的对结果进行展示。对于第一点,或许存在直接手动复现镜像的可能,但是考虑到Isaac Sim/Isaac Lab由于比较新,可能不够稳定,因此还是按照官方文档进行部署。

weixin_44211433的博客 4587

设计模式-建造者模式实例-02

一、实验目的和要求: 2.建造者模式的运用 (1)案例背景: 计算机组装工厂可以将CPU,内存,硬盘,主机,显示器等硬件设备组装在一起构成一台完整的计算机,且构成的计算机可以是笔记本电脑,也可以是台式机,还可以是不提供显示器的服务器主机。对于用户来言,无需关心计算机的组成设备和组装过程,工厂返回给用户的是完整的计算机对象。所以我们可以使用建造者模式来实现计算机的组成过程,请绘制出类图并编程实现 ...

LYly_B的博客 2254

【FnOS飞牛云 | NAS存储】旧电脑不吃灰,手把手教你搭建完全属于自己的私人网盘

打造属于自己的NAS私人网盘,亲测有效,值得一试

木子Linux的博客世界 9413

(java)创建型模式之生成器模式

实验要求: 电脑组装工厂可以将CPU、内存、硬盘、主机、显示器、等硬件设备组装在一起构成一台完整的电脑,且构成的电脑可以是笔记本,也可以是台式机,还可以是不提供显示器的服务器主机。对于用户而言,无需关心电脑的组成设备和组装过程,工厂返回给用户的是完整的的电脑对象。使用生成器模式(建造者模式)实现电脑组装过程,要求绘制类图并使用java代码编程模拟实现 类结构图 : computer: package com.ag.builder; import lombok.AllArgsConstruct

xiaoniu667的博客 8080

从Palantir到AI时代:Forward Deployed Engineer模式的深度解析

《从Palantir到AI时代:FDE模式的创新与挑战》摘要:Palantir开创的前置部署工程师(FDE)模式正在成为AI创业公司的标配。该模式通过现场工程师深入了解客户需求,填补产品与实际应用间的鸿沟,颠覆了传统SaaS规模化路径。核心优势在于将定制化服务转化为产品发现机制,特别适合高度异质化的AI市场。成功关键在于平衡定制与标准化,通过合同价值增长、产品杠杆效应等独特指标衡量成效。FDE人才需要兼具领域洞察力与快速原型能力。这一模式表明,在AI等新兴领域,深入客户现场可能比单纯追求技术突破更能创造商业

老孙 | Ethan Sun 的博客:AI 智能体与 AI 原生软件的工程实践 4531

Ai数字人直播系统源码部署

虚拟形象定制,直播内容智能生成,多语言支持,智能互动,声音克隆,24 小时不间断直播,多平台直播,智能数据分析,实时情感识别,视频合成,Ai数字人直播系统源码出售,Ai数字人直播系统源码部署实现 AI 数字人 24 小时不间断直播功能是一个较为复杂的任务,涉及到多个方面,如直播流的推送、内容的持续生成、系统的稳定性保障等。以下为你提供一个简化的实现思路和示例代码,借助 Python 结合 FFmpeg 工具来模拟 24 小时不间断直播。

weixin_ggwwsscc的博客 1255

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

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

冯浩月 9638

【WRF模拟】土地利用类型的确定:最大覆盖法/瓦片法

土地利用类型的确定:最大覆盖法/瓦片法

WW、forever的博客 1529

《设计模式》创建型模式总结

首先,要明确这里所说的设计模式重点聚焦系统级的设计,系统本质上是一组类实例的组合,它区别于单一的类或者接口的设计,需要一定的抽象才能够使得后续的编码工作更有效率。创建型模式的最主要作用就是抽象了系统的实例化过程。在没有这种抽象之前,系统的实例化只是单纯的被看作是N个类的实例化,不利于后续的编码执行。这种抽象在大体上有两个实现的原则。其一是将系统所需要用到的各种类信息给封装起来;其二是把这些类的创建和组合方式也给隐藏起来。总之,整个系统有一套抽象的接口负责统一和外部对接。

weixin_50353846的博客 1446

Avalonia+ReactiveUI跨平台路由:从零到舞者,你的UI也能跨界起舞?

至此,你已掌握了Avalonia+ReactiveUI的跨平台路由精髓!你的应用现在能够优雅地在各个界面间穿梭,就像是在不同星球间跳跃的宇宙飞船。无论是初探跨平台开发的新手,还是经验丰富的老船长,这段旅程都能让你的UI编排技能更上一层楼。现在,是时候让世界见证你的跨平台魔术了!💫记住,每一次实践都是向着完美编舞迈进的一步,勇敢地在你的项目中尝试吧!如果在航行中遇到风暴,别忘了回来看看这篇指南,或者在评论区抛出你的救生圈,我们一起解决!🌊。

java专栏 1534

电子凸轮追剪算法深度解析:2500字图解+代码实战

工艺需求:在物料连续运动过程中完成精准切割核心矛盾:切割瞬间刀具与物料必须绝对同步传统方案:机械凸轮(结构复杂,调整困难)现代方案:电子凸轮(柔性可调,精度更高)

QQ_778132974的博客 1109

设计模式之创建型模式详解

简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。工厂方法模式(Factory Method Pattern)又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式,它属于类创建型模式。

zengchenAAA的博客 1768

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Java 创建型设计模式详解

概念抽象工厂模式提供了一个接口,用于创建一系列相关或互相依赖的对象,而无需指定它们的具体类。它通常用于创建一组相关产品,如操作系统的不同界面风格。结构抽象工厂类(AbstractFactory):声明创建一组相关产品的方法。具体工厂类(ConcreteFactory):实现抽象工厂的方法,生成一系列具体产品。抽象产品类(AbstractProduct):定义产品的接口。具体产品类(ConcreteProduct):实现具体产品。示例代码// 抽象产品Avoid use();

WenZhang的博客 2309

OV9734 DATASHEET,完整规格书

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

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

设计模式创建型

最近在进行设计模式的学习,今天将创建型的设计模式总结在这里,区分不同的设计模式的用法和作用本文讲述了设计模式中5个创建型模式,并且给出了对应的代码示例。用好设计模式可以大大的提升我们的代码的维护性、扩充性。希望大家看完这篇文章能了解,学会这5个设计模式,并且以后在用的时候能想起来。

郝老三~~~~~~~~~~~~~ 5082

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Java设计模式之创建型模式

单例模式 应用场合: 在一个JVM中,该对象只需有一个实例存在 特点: 对于创建频繁的大型对象可以降低系统开销 减轻GC压力(Garbage collection) 安全(核心交易引擎) 实现方式: 加载类时直接创建类的实例(性能提前消耗 浪费) public class Singleton { private Singleton(){}; private

yhao的博客 3823

C++设计模式之创建型模式

我们一定要牢记设计模式是前人总结的一套可以有效解决问题的经验,不要一写代码就在考虑该使用什么设计模式,这是极其不可取的。正确的做法应该是在实现业务需求的同时,尽量遵守面向对象设计的六大设计原则即可。后期随着业务的扩展,你的代码会不断的演化和重构,在此过程中设计模式绝逼会大放异彩的。说实话博主写完这篇文章感觉原型模式模式是不是有点多余啊,想复制原来创建的新的对象,使用拷贝构造函数不就可以了嘛,为什么还要弄一个新的设计模式出来呢。目前博主的理解就到这啦,有兴趣的可以后台TT博主一起交流呀!

weixin_62196764的博客 1105

设计模式之创建型模式

在Java中,有23种经典的设计模式,它们分为三种类型:创建型模式、结构型模式和行为型模式。创建型模式:创建型模式是一种设计模式,主要用于处理对象的创建过程,它将对象的创建和使用分离,使得系统更加灵活和可扩展。结构型模式;结构型设计模式主要关注对象组合的方式,用于描述如何将类或对象结合在一起形成更大的结构。行为型模式:行为型设计模式主要关注对象之间的通信和职责分配,描述了对象之间的相互作用和责任分配方式。

emmmm的博客 1339

设计模式-创建型模式总结

创建型模式,顾名思义,就是用来创建对象的模式。它抽象了实例化过程,帮助一个系统独立于如何创建、组合和表示它的对象。

潘威威的博客 2558

设计模式之创建型设计模式

创建型设计模式是用于对象的创建和实例化的模式,旨在解决对象的创建问题,以便更加灵活地创建对象并将对象与使用它们的代码分离。单例模式(Singleton Pattern):确保一个类只有一个实例,并提供对该实例的全局访问点。工厂模式(Factory Pattern):定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法使一个类的实例化延迟到其子类中。抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或依赖对象的接口,而无需指定它们具体的类。

zz18532164242的博客 766
上一篇: Android——自定义View
下一篇: 设计模式——结构型模式
PdKingLiu
博客等级 码龄9年 89粉丝 92原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值