首页 > 其他分享 >设计模式II

设计模式II

时间:2024-06-24 09:33:33浏览次数:30  
标签:对象 创建 建造 II 构建 产品 具体 设计模式

建造者模式

在建造者模式中,通常会定义以下接口/抽象类:

抽象建造者接口(Builder):定义了构建产品各个部分的抽象方法,通常包括创建产品和设置产品各个部分的方法。具体建造者类将实现这个接口来构建产品的各个部分。
产品接口(Product):定义了产品的抽象接口,通常包括产品的属性和行为。具体的产品类将实现这个接口来表示实际构建完成的产品。

在建造者模式中,通常涉及以下几种具体类:

具体建造者(Concrete Builder):实现了抽象建造者接口,负责实际构建产品的各个部分。具体建造者类通常包括一个产品实例以及实现构建产品各个部分的方法。

指导者(Director):负责指导构建过程,即按照一定的顺序调用具体建造者的方法来构建产品。

客户端不需要直接与具体建造者类交互,而是通过指导者类根据需要自定义构建过程。这样客户端只需与指导者类进行交互,而不必了解具体的构建细节。
指导者类通常包含一个构建方法,该方法接受一个具体建造者对象作为参数,然后按照一定的顺序调用具体建造者的方法来构建产品。指导者类根据具体的构建需求和流程,来决定调用具体建造者的方法的顺序和方式。(通常并不直接创建产品。)

建造者模式中的指导者类并不构建一个具体的产品对象,而是协调建造者来构建复杂对象。

产品实现类(Concrete Product):具体产品类,实现了产品接口,表示最终构建完成的产品。产品实现类通常由具体建造者来创建并返回给客户端

在建造者模式中,产品的组装通常由客户端代码负责。:客户端通过创建指导者(Director)对象,并将具体建造者(Concrete Builder)对象传递给指导者,来控制产品的构建过程。然后,指导者类按照一定的顺序调用具体建造者的方法来构建产品的各个部分。最后,客户端通过调用具体建造者的方法获取构建完成的产品对象。

原型模式
原型模式属于创建型设计模式。通过复制现有的实例来创建新的实例
抽象原型类(Prototype):定义了一个抽象的克隆方法。
具体原型类(ConcretePrototyoe):实现抽象原型类(接口)定义的克隆方法,提供一个具体的克隆方法来复制自己。
客户端(Client):使用原型类的对象来实现具体的操作,即通过复制原型对象来创建新的对象。
浅拷贝
浅拷贝(shallow copy)和赋值(assignment)创建对象副本的方式有着重要的区别:

对象复制的方式:

浅拷贝:浅拷贝创建一个新对象,但是对于该对象内部的元素,仅仅是复制了引用而不是复制元素本身。换句话说,浅拷贝创建了一个新的容器对象,但是该容器内的元素与原始对象中的元素指向相同的内存地址。此外的内容则是独立的副本
赋值:赋值操作仅仅是将一个对象的引用(内存地址)赋给另一个变量,两者指向同一块内存区域。因此,修改其中一个变量的内容会影响到另一个变量。
影响范围:

浅拷贝:对于可变对象(如列表、字典等),浅拷贝会创建一个新对象,但是其内部的可变元素(如列表中的元素)仍然会被共享。这意味着对于这些可变元素的修改会影响到原始对象和副本对象。
赋值:赋值操作会使两个变量指向同一块内存区域,因此对任何一个变量进行修改都会影响到另一个变量。
适用场景:

浅拷贝:适用于需要复制对象但又不希望复制其内部元素的场景,或者在需要修改副本对象而不影响原始对象的情况下使用。
赋值:适用于简单的对象赋值操作,或者在需要两个变量共享相同对象的情况下使用。
浅拷贝是使用默认的clone()方法来实现

在Java中,原型模式的核心是通过实现 Cloneable 接口来实现对象的克隆。这个接口没有定义任何方法,但是它表明了该对象是可复制的
sheep = (Sheep) super.clone();
new:每次使用 "new" 关键字创建对象时,都会得到一个全新的对象实例,它与之前创建的对象完全独立。
clone:使用 "clone" 方法创建的对象是原始对象的副本,但是它们之间并不是完全独立的。通常情况下,副本对象和原始对象之间共享相同的内部状态,但是它们在内存中拥有不同的引用地址
new:通常用于创建全新的对象实例,无需共享状态或复制原始对象的情况。
clone:适用于需要创建对象副本的情况,但又希望保留对象内部状态的情况。例如,在需要使用原始对象的副本进行修改而不影响原始对象的情况下,可以使用 "clone" 方法。

单例模式
单例模式是指在内存中只会创建且仅创建一次对象的设计模式。在程序中多次使用同一个对象且作用相同时,为了防止频繁地创建对象使得内存飙升,单例模式可以让程序仅在内存中创建一个对象,让所有需要调用的地方都共享这一单例对象

有两种类型:

懒汉式:在真正需要使用对象时才去创建该单例类对象
饿汉式:在类加载时已经创建好该单例对象,等待被程序使用

因为需要两次判空,且对类对象加锁,该懒汉式写法也被称为:Double Check(双重校验) + Lock(加锁)
使用volatile防止指令重排
创建一个对象,在JVM中会经过三步:

(1)为singleton分配内存空间

(2)初始化singleton对象

(3)将singleton指向分配好的内存空间

指令重排序是指:JVM在保证最终结果正确的情况下,可以不按照程序编码的顺序执行语句,尽可能提高程序的性能

在这三步中,第2、3步有可能会发生指令重排现象,创建对象的顺序变为1-3-2,会导致多个线程获取对象时,有可能线程A创建对象的过程中,执行了1、3步骤,线程B判断singleton已经不为空,获取到未初始化的singleton对象,就会报NPE异常
使用volatile关键字可以防止指令重排序

1.如果一个类不能通过NEW创建实例对象(从外部调用构造函数),要定义为私有类型构造函数
2.私有静态成员变量保存唯一实例
3.向外部提供一个访问接口去访问实例,公有的静态共享方法。定义为static

标签:对象,创建,建造,II,构建,产品,具体,设计模式
From: https://www.cnblogs.com/xiyiji/p/18151866

相关文章

  • 结构型设计模式
    适配器模式需求方法M1。但已经存在一个方法M2能实现需求功能,引入子类来覆盖M1方法(M1方法中调用已有的M2方法)。这个新子类就是适配器将已有的方法转换为需求的另一种方法(一般由于方法名差异;参数不同)这一模式中的“接口”是广义接口,可代指一个/一组方法集合优点:无需修改已有内容......
  • 代码随想录算法训练营第46天 | 121. 买卖股票的最佳时机 、122.买卖股票的最佳时机II
    股票问题是一个动态规划的系列问题,前两题并不难,第三题有难度。买卖股票的最佳时机视频讲解:https://www.bilibili.com/video/BV1Xe4y1u77qhttps://programmercarl.com/0121.买卖股票的最佳时机.html/***@param{number[]}prices*@return{number}*/varmaxProfit=......
  • 代码随想录算法训练营第45天 | 198.打家劫舍 、213.打家劫舍II 、337.打家劫舍III
    今天就是打家劫舍的一天,这个系列不算难,大家可以一口气拿下。198.打家劫舍视频讲解:https://www.bilibili.com/video/BV1Te411N7SXhttps://programmercarl.com/0198.打家劫舍.html/***@param{number[]}nums*@return{number}*/varrob=function(nums){const......
  • 设计模式-观察者模式
    观察者模式观察者模式(ObserverPattern),又叫发布-订阅(Publisher/Subscribe)模式,模型-视图模式,源-监听器模式或从属者模式。定义一种一对多的依赖关系,一个主题对象可以同时被多个监听者同时监听,使得每当主题对象状态发生变化时,所有依赖于它的对象都会得到通知并被自动更新。属于行为......
  • Day 30 | 122.买卖股票的最佳时机II、55. 跳跃游戏 、45.跳跃游戏II、 1005.K次取反后
    122.买卖股票的最佳时机II本题解法很巧妙,本题大家可以先自己思考一下然后再看题解,会有惊喜!https://programmercarl.com/0122.买卖股票的最佳时机II.html给定一个数组,它的第i个元素是一支给定股票第i天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成......
  • 代码随想录DAY2|有序数组的平方|长度最小的子数组|螺旋矩阵II
    有序数组的平方有序数组的平方解题思路最优的解法是通过双指针,由于该数组是一个非递减数列,我们只需要将数组的首尾两端作为两个指针的起始位置,然后进行比较就行。具体地讲,双指针所指向的值相互比较,把较大的值放入新的数组的开通,然后该指针往前(如果是在首端的指针,则往后)。重复这......
  • [最全]设计模式实战(总序)
    最近一段时间,读完了《Android源码设计模式-解析与实战》和《大话设计模式》这两本经典设计模式相关书籍,撰写相关笔记。每种设计模式将从以下方式聊聊:1.是什么(What,即定义);解决什么问题(Why,即使用场景)2.如何使用(How,即最简UML图+Java代码)3.生活场景举例(贴近生活,更易理解)4.......
  • 【数学】100332. 包含所有 1 的最小矩形面积 II
    本文涉及知识点数学LeetCode100332.包含所有1的最小矩形面积II给你一个二维二进制数组grid。你需要找到3个不重叠、面积非零、边在水平方向和竖直方向上的矩形,并且满足grid中所有的1都在这些矩形的内部。返回这些矩形面积之和的最小可能值。注意,这些......
  • 力扣-122. 买卖股票的最佳时机 II
    1.题目题目地址(122.买卖股票的最佳时机II-力扣(LeetCode))https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/题目描述给你一个整数数组prices,其中 prices[i]表示某支股票第i天的价格。在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最......
  • windows服务器上用nginx转发到iis中的网站
    windows服务器上用nginx转发到iis中的网站2024年6月23日测试通过前提:华为云1核心2G内存1M带宽服务器¥40/年,还没有备案,80端口用不了,在安全组里把81端口打开了,同时记得登录云服务器里把WINDOWS的防火墙关闭或者放行81端口想法:windows服务器里下载nginxwindows版本,然后所有请求......