常用到的设计模式(1)

单例模式

所谓单例模式,就是确保一个类仅有一个实例,并提供一个访问它的全局访问点。单例模式又分为饿汉式单例和懒汉式单例。

饿汉式

第一次引用该类的时候就创建对象实例,而不管实际是否需要创建。

public class Test {private static final Test instance=new Test();private Test(){}public static Test getInstance(){return instance;}
}

懒汉式

什么时候用就什么时候创建实例,存在线程安全问题。实例在开始时为空,第一次加载后才实例化。

public class Test {private volatile static Test instance=null;private Test(){}public static Test getInstance(){if(instance==null) {instance=new Test();}return instance;}
}

双层检测锁模式

双重锁模式,是对饱汉模式的优化,进行双重判断,当已经创建过实例对象后就无需加锁。

public class Test {private volatile static Test instance=null;private Test(){}public static Test getInstance(){if(instance==null) {synchronized (Test.class){if(instance==null) {instance=new Test();}}}return instance;}
}

工厂模式

工厂模式将创建对象的具体过程屏蔽隔离起来。工厂模式可以分为三类:简单工厂模式、工厂方法模式、抽象工厂模式。

简单工厂模式

简单工厂模式最重要的就是定义一个创建对象的接口。
Pizza类:

abstract class Pizza {public Pizza(){}
}
public class FruitPizza extends Pizza{public FruitPizza() {System.out.println("水果披萨");}
}
public class MeatPizza extends Pizza{public MeatPizza(){System.out.println("肉披萨");}
}

工厂类:

public class PizzaFactory {public Pizza createPizza(int type) {switch (type) {case 1:return new FruitPizza();case 2:return new MeatPizza();default:break;}return null;}
}

工厂方法模式

承接上例中的Pizza类。
工厂类:

interface FactoryPizza {Pizza createPizza();
}
public class FactoryFruitPizza implements FactoryPizza{@Overridepublic FruitPizza createPizza() {return new FruitPizza();}
}
public class FactoryMeatPizza implements FactoryPizza {@Overridepublic MeatPizza createPizza() {return new MeatPizza();}
}

抽象工厂模式

相机相关类:

//镜头
public interface Lens {}  
public class LensA implements Lens{  public LensA(){  System.out.println("索尼镜头");  }  
}  
public class LensB implements Lens{  public LensB(){  System.out.println("佳能镜头");  }  
}  
//机身
public interface CameraBody {} 
public class CameraBodyA implements CameraBody{  public CameraBodyA(){  System.out.println("索尼机身");  }  
}  
public class CameraBodyB implements CameraBody{  public CameraBodyB(){  System.out.println("佳能机身");  }  
} 

相机代理商类:

public interface CameraFactory {  public Lens createLens();public CameraBody createCameraBody(); 
}  
//生产索尼相机
public class FactorySONY implements CameraFactory{     @Override  public Lens createLens() {    return new LensA();  }  @Override  public CameraBody createCameraBody() {  return new CameraBodyA();  }  
}  
//佳能相机
public class FactoryCanon implements CameraFactory{ {  @Override  public Lens createLens() {    return new LensB();  }  @Override  public CameraBody createCameraBody() {  return new CameraBodyB();  }  
} 

建造者模式

建造者模式旨在把一个流程分解到不同的方法中,避免某个方法过于繁重,每个方法相互独立。
穿搭类:

public class Dressing {private String clothes;private String shoes;public String getClothes() {return clothes;}public void setClothes(String clothes) {this.clothes = clothes;}public String getShoes() {return shoes;}public void setShoes(String shoes) {this.shoes = shoes;}
}

穿搭构造类:

public abstract class DressingBuilder {Dressing dressing= new Dressing();public abstract void buildClothes();public abstract void buildShoes();public Dressing getDressing(){return dressing;}
}

穿搭A、穿搭B。

public class DressingA extends DressingBuilder{public void buildClothes() {dressing.setClothes("衣服A");}public void buildShoes() {dressing.setShoes("鞋子A");}}
public class DressingB extends DressingBuilder{public void buildClothes() {dressing.setClothes("衣服B");}public void buildShoes() {dressing.setShoes("鞋子B");}
}

最后由构建人员搭配衣服

public class DressingPerson{private DressingBuilder dressingBuilder;public void setDressingBuilder(DressingBuilder dressingBuilder) {this.dressingBuilder = dressingBuilder ;}public Dressing construct(){dressingBuilder.buildClothes();dressingBuilder.buildShoes();return dressingBuilder.getDressing();}
}

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

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

相关文章

linux 编译安装libzmq

准备工作 sudo apt-get install autoconf automake libtool 下载源码 git clone https://github.com/zeromq/libzmq.git 编译 cd libzmq ./autogen.sh ./configure && make check sudo make install sudo ldconfig测试 cd tests ./test_msg_init结果:…

xcode opencv

1、导入报错 Undefined symbols: linker command failed with exit code 1 (use -v to see invocation) 直接添加如下图内容即可

<JavaEE> synchronized关键字和锁机制 -- 锁的特点、锁的使用、锁竞争和死锁、死锁的解决方法

目录 一、synchronized 关键字简介 二、synchronized 的特点 -- 互斥 三、synchronized 的特点 -- 可重入 四、synchronized 的使用示例 4.1 修饰代码块 - 锁任意实例 4.2 修饰代码块 - 锁当前实例 4.3 修饰普通方法 - 锁方法所在实例 4.4 修饰代码块 - 锁指定类对象 …

【从零开始学习JVM | 第二篇】字节码文件的组成

前言: 字节码作为JAVA跨平台的主要原因,熟练的掌握JAVA字节码文件的组成可以帮助我们解决项目的各种问题,并且在面试中,关于字节码部分的内容却是一大考点和难点,因此我们在这里穿插讲解一下字节码文件的组成。 目录 …

16、观察者模式(Observer Pattern)

观察者(Observer Pattern) 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。主要解决一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合&…

关于回收套接字和释放上下文的顺序

关于回收套接字和释放上下文的顺序 回收套接字和释放上下文的顺序是为了确保正确的资源管理和避免悬空指针或内存泄漏等问题。顺序如下: 套接字的回收:在网络编程中,使用套接字进行通信后,应该及时关闭套接字以释放系统资源。这可…

你好!哈希表【JAVA】

1.初识🎶🎶🎶 它基本上是由一个数组和一个哈希函数组成的。哈希函数将每个键映射到数组的特定索引位置,这个位置被称为哈希码。当我们需要查找一个键时,哈希函数会计算其哈希码并立即返回结果,因此我们可以…

【OpenGauss源码学习 —— (RowToVec)算子】

VecToRow 算子 概述ExecInitRowToVec 函数ExecRowToVec 函数VectorizeOneTuple 函数 ExecEndRowToVec 函数总结 声明:本文的部分内容参考了他人的文章。在编写过程中,我们尊重他人的知识产权和学术成果,力求遵循合理使用原则,并在…

github首次将文件合到远端分支,发现名字不是master,而是main

暂存区和本地仓库的信息都存储在.git目录中其中 其中,暂存区和本地仓库的信息都存储在.git目录中 在自己的github上实践 1、刚开始,git clone gitgithub.com:lingze8678/my_github.git到本地 2、在克隆后的代码中加入一个pdf文件 3、在git bash中操作…

【Python函数】匿名函数

定义&#xff1a; 短小的回调函数好处&#xff1a; 省去定义函数的步骤&#xff0c;更加简洁 生命周期&#xff1a; 使用时定义-调用完返回函数本身以及内存位置<function <lambda> at xxxx> 语法&#xff1a;lambda [ar1[,arg2]]: expression arguments是参数expr…

CentOS增加虚拟内存 (Linux增加内存)

前言 因为囊中羞涩不敢言&#xff0c;所以内存只有2G&#xff0c;项目在运行的时候&#xff0c;占用的内存已经报表&#xff0c;所以有的时候就会出现宕机的情况发生&#xff0c;后面发现可以通过使用增加虚拟内存空间&#xff0c;来增加内存容量。 下面进入正题&#xff0c;讲…

Selenium+Python自动化测试之验证码处理

两种方式&#xff1a; 验证码识别技术 (很难达到100%) 添加Cookie &#xff08;*****五星推荐&#xff09; 方式一&#xff1a;验证码识别技术 逻辑方式&#xff1a; 1&#xff1a;打开验证码所在页面&#xff0c;截图。获取验证码元素坐标&#xff0c;剪切出验证码图片&…

【MATLAB】辛几何模态分解分解+FFT+HHT组合算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 辛几何模态分解&#xff08;CEEMDAN&#xff09;是一种处理非线性和非平稳信号的适应性信号分解方法。通过在信号中加入白噪声&#xff0c;并多次进行经验模态分解&#xff08;EMD&#…

深度学习TensorFlow2基础知识学习前半部分

目录 测试TensorFlow是否支持GPU&#xff1a; 自动求导&#xff1a; 数据预处理 之 统一数组维度 定义变量和常量 训练模型的时候设备变量的设置 生成随机数据 交叉熵损失CE和均方误差函数MSE 全连接Dense层 维度变换reshape 增加或减小维度 数组合并 广播机制&#…

clickhouse的向量化执行

背景 clickhouse快的很大一部分原因来源于数据的向量化执行&#xff0c;本文就来看一下向量化执行和正常标量执行的区别 SIMD的向量化执行 从上图可知&#xff0c;clickhouse通过SIMD指令可以做到一个cpu周期操作两个向量的运算操作&#xff0c;比起普通的cpu指令效率提高了N…

第一百十九回 如何Text组件中的文字自动换行

文章目录 1. 概念介绍2. 实现方法2.1 基本用法2.2 特殊用法3. 示例代码4. 内容总结我们在上一章回中介绍了"分享三个使用TextField的细节"相关的内容,本章回中将 介绍如何让Text组件中的文字自动换行.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章…

Understanding Computer Hardware

文章目录 I. Input Devices1. Keyboard&#xff08;1&#xff09;Layout&#xff08;2&#xff09;Key Types&#xff08;3&#xff09;Functionality&#xff08;4&#xff09;Connectivity&#xff08;5&#xff09;Ergonomics&#xff08;6&#xff09;Multimedia Keys&…

【计算机组成体系结构】主存储器的基本组成

一、半导体元器件存储二进制0/1的原理 一个存储器逻辑上分为MAR&#xff0c;MDR和存储体&#xff0c;这三块在时序逻辑电路的控制下相互配合工作。 而存储体有多个存储单元构成&#xff0c;每个存储单元又由每个存储元构成。一个存储元可以存放一位的二进制的0/1。 一个存储元…

OWASP安全练习靶场juice shop-更新中

Juice Shop是用Node.js&#xff0c;Express和Angular编写的。这是第一个 完全用 JavaScript 编写的应用程序&#xff0c;列在 OWASP VWA 目录中。 该应用程序包含大量不同的黑客挑战 用户应该利用底层的困难 漏洞。黑客攻击进度在记分板上跟踪。 找到这个记分牌实际上是&#…

【Android】在Android中设置网络代理:一文详解

在Android中设置网络代理&#xff1a;一文详解 引言 在移动设备上&#xff0c;特别是Android平台&#xff0c;设置网络代理是一种常见的需求&#xff0c;可以通过网络代理实现对网络请求和响应的拦截和修改。本文将详细介绍在Android设备上通过adb命令设置全局HTTP代理的方法…