重庆做网站泉州公司辽阳建设网站公司报价

pingmian/2026/1/20 15:47:23/文章来源:
重庆做网站泉州公司,辽阳建设网站公司报价,株洲seo网站推广,哈尔滨百度关键词优化常用的设计模式#xff1a; 一、单例模式 java中单例模式是一种常见的设计模式#xff0c;单例模式的写法有好几种#xff0c;这里主要介绍三种#xff1a;懒汉式单例、饿汉式单例、双重检查锁定 1、单例模式有以下特点#xff1a;   a、单例类只能有一个实例。   b…常用的设计模式 一、单例模式 java中单例模式是一种常见的设计模式单例模式的写法有好几种这里主要介绍三种懒汉式单例、饿汉式单例、双重检查锁定 1、单例模式有以下特点   a、单例类只能有一个实例。   b、单例类必须自己创建自己的唯一实例。   c、单例类必须给所有其他对象提供这一实例。 2、代码特点   a、私有静态变量   b、私有构造方法   c、公有的静态访问方法 3、懒汉式 - 懒汉式非线程安全 public class Singleton {private Singleton() {}private static Singleton singlenull;//静态工厂方法 public static Singleton getInstance() {if (single null) { single new Singleton();} return single;} }4、饿汉式 - 线程安全 //饿汉式单例类.在类初始化时已经自行实例化 public class Singleton1 {private Singleton1() {}private static final Singleton1 single new Singleton1();//静态工厂方法 public static Singleton1 getInstance() {return single;}} 饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用以后不再改变所以天生是线程安全的。 5、懒汉式和饿汉式区别 6、双重检查锁定 public static Singleton getInstance() {if (singleton null) { synchronized (Singleton.class) { if (singleton null) { singleton new Singleton(); } } } return singleton; }7、应用场景 a、需要频繁创建的一些类使用单例可以降低系统的内存压力减少 GC。 a、某类只要求生成一个对象的时候如一个班中的班长等。 b、某些类创建实例时占用资源较多或实例化耗时较长且经常使用。 c、某类需要频繁实例化而创建的对象又频繁被销毁的时候如多线程的线程池、网络连接池等。 e、频繁访问数据库或文件的对象。 二、工厂模式 工厂模式是 Java 中最常用的设计模式之一工厂模式模式的写法有好几种这里主要介绍三种简单工厂模式、工厂模式、抽象工厂模式 1、简单工厂模式 这里以制造coffee的例子开始工厂模式设计之旅。 我们知道coffee只是一种泛举在点购咖啡时需要指定具体的咖啡种类美式咖啡、卡布奇诺、拿铁等等。 /*** 拿铁、美式咖啡、卡布奇诺等均为咖啡家族的一种产品* 咖啡则作为一种抽象概念* author Lsj**/ public abstract class Coffee {/*** 获取coffee名称* return*/public abstract String getName(); }/*** 美式咖啡* author Lsj**/ public class Americano extends Coffee {Overridepublic String getName() {return 美式咖啡;} }/*** 卡布奇诺* author Lsj**/ public class Cappuccino extends Coffee {Overridepublic String getName() {return 卡布奇诺;} } /*** 拿铁* author Lsj**/ public class Latte extends Coffee {Overridepublic String getName() {return 拿铁;} }2、工厂模式 定义了一个创建对象的接口但由子类决定要实例化的类是哪一个工厂方法让类把实例化推迟到了子类。 /*** 定义一个抽象的咖啡工厂* author Lsj*/ public abstract class CoffeeFactory {/*** 生产可制造的咖啡* return*/public abstract Coffee[] createCoffee();}/*** 中国咖啡工厂* author Lsj**/ public class ChinaCoffeeFactory extends CoffeeFactory {Overridepublic Coffee[] createCoffee() {// TODO Auto-generated method stubreturn new Coffee[]{new Cappuccino(), new Latte()};} } /*** 美国咖啡工厂* author Lsj**/ public class AmericaCoffeeFactory extends CoffeeFactory {Overridepublic Coffee[] createCoffee() {// TODO Auto-generated method stubreturn new Coffee[]{new Americano(), new Latte()};}} /*** 工厂方法测试* author Lsj**/ public class FactoryMethodTest {static void print(Coffee[] c){for (Coffee coffee : c) {System.out.println(coffee.getName());}}public static void main(String[] args) {CoffeeFactory chinaCoffeeFactory new ChinaCoffeeFactory();Coffee[] chinaCoffees chinaCoffeeFactory.createCoffee();System.out.println(中国咖啡工厂可以生产的咖啡有);print(chinaCoffees);CoffeeFactory americaCoffeeFactory new AmericaCoffeeFactory();Coffee[] americaCoffees americaCoffeeFactory.createCoffee();System.out.println(美国咖啡工厂可以生产的咖啡有);print(americaCoffees);} }3、抽象工厂 提供一个接口用于创建相关或依赖对象的家族而不需要明确指定具体类。 在上述的场景上继续延伸咖啡工厂做大做强引入了新的饮品种类茶、 碳酸饮料。中国工厂只能制造咖啡和茶美国工厂只能制造咖啡和碳酸饮料。 如果用上述工厂方法方式除去对应的产品实体类还需要新增2个抽象工厂茶制造工厂、碳酸饮料制造工厂4个具体工厂实现。随着产品的增多会导致类爆炸。 所以这里引出一个概念产品家族在此例子中不同的饮品就组成我们的饮品家族 饮品家族开始承担创建者的责任负责制造不同的产品。 /*** 抽象的饮料产品家族制造工厂* author Lsj**/ public interface AbstractDrinksFactory {/*** 制造咖啡* return*/Coffee createCoffee();/*** 制造茶* return*/Tea createTea();/*** 制造碳酸饮料* return*/Sodas createSodas(); }/*** 中国饮品工厂* 制造咖啡与茶* author Lsj**/ public class ChinaDrinksFactory implements AbstractDrinksFactory {Overridepublic Coffee createCoffee() {// TODO Auto-generated method stubreturn new Latte();}Overridepublic Tea createTea() {// TODO Auto-generated method stubreturn new MilkTea();}Overridepublic Sodas createSodas() {// TODO Auto-generated method stubreturn null;}}/*** 美国饮品制造工厂* 制造咖啡和碳酸饮料* author Lsj**/ public class AmericaDrinksFactory implements AbstractDrinksFactory {Overridepublic Coffee createCoffee() {// TODO Auto-generated method stubreturn new Latte();}Overridepublic Tea createTea() {// TODO Auto-generated method stubreturn null;}Overridepublic Sodas createSodas() {// TODO Auto-generated method stubreturn new CocaCola();}}/*** 抽象工厂测试类* author Lsj**/ public class AbstractFactoryTest {static void print(Drink drink){if(drink null){System.out.println(产品-- );}else{System.out.println(产品 drink.getName());}}public static void main(String[] args) {AbstractDrinksFactory chinaDrinksFactory new ChinaDrinksFactory();Coffee coffee chinaDrinksFactory.createCoffee();Tea tea chinaDrinksFactory.createTea();Sodas sodas chinaDrinksFactory.createSodas();System.out.println(中国饮品工厂有如下产品);print(coffee);print(tea);print(sodas);AbstractDrinksFactory americaDrinksFactory new AmericaDrinksFactory();coffee americaDrinksFactory.createCoffee();tea americaDrinksFactory.createTea();sodas americaDrinksFactory.createSodas();System.out.println(美国饮品工厂有如下产品);print(coffee);print(tea);print(sodas);} }4、总结 a、简单工厂不能算是真正意义上的设计模式但可以将客户程序从具体类解耦。 b、工厂方法使用继承把对象的创建委托给子类由子类来实现创建方法可以看作是抽象工厂模式中只有单一产品的情况。 c、抽象工厂使对象的创建被实现在工厂接口所暴露出来的方法中。 工厂模式可以帮助我们针对抽象/接口编程而不是针对具体类编程在不同的场景下按具体情况来使用。 三、代理模式 代理模式即通过代理对象访问目标对象实现目标对象的方法。这样做的好处是可以在目标对象实现的基础上增强额外的功能操作实现对目标功能的扩展。 这涉及到一个编程思想不要随意去修改别人已经写好的代码或者方法有坑。如果需要修改可以通过代理模式实现。 代理模式通常有三种实现写法静态代理、动态代理、Cglib代理 代理模式的UML图 从UML图中可以看出代理类与真正实现的类都是继承了抽象的主题类这样的好处在于代理类可以与实际的类有相同的方法可以保证客户端使用的透明性。 1、静态代理 我们先看针对上面UML实现的例子再看静态代理的特点。 Subject接口的实现 public interface Subject {void visit(); }实现了Subject接口的两个类 public class RealSubject implements Subject {private String name byhieg;Overridepublic void visit() {System.out.println(name);} } public class ProxySubject implements Subject{private Subject subject;public ProxySubject(Subject subject) {this.subject subject;}Overridepublic void visit() {subject.visit();} }具体调用如下 public class Client {public static void main(String[] args) {ProxySubject subject new ProxySubject(new RealSubject());subject.visit();} }通过上面的代理代码我们可以看出代理模式的特点代理类接受一个Subject接口的对象任何实现该接口的对象都可以通过代理类进行代理增加了通用性。但是也有缺点每一个代理类都必须实现一遍委托类也就是realsubject的接口如果接口增加方法则代理类也必须跟着修改。其次代理类每一个接口对象对应一个委托对象如果委托对象非常多则静态代理类就非常臃肿难以胜任。 2、动态代理 动态代理有别于静态代理是根据代理的对象动态创建代理类。这样就可以避免静态代理中代理类接口过多的问题。动态代理是实现方式是通过反射来实现的借助Java自带的java.lang.reflect.Proxy,通过固定的规则生成。 其步骤如下 编写一个委托类的接口即静态代理的Subject接口 实现一个真正的委托类即静态代理的RealSubject类 创建一个动态代理类实现InvocationHandler接口并重写该invoke方法 在测试类中生成动态代理的对象。 第一二步骤和静态代理一样不过说了。第三步代码如下 public class DynamicProxy implements InvocationHandler {private Object object;public DynamicProxy(Object object) {this.object object;}Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {Object result method.invoke(object, args);return result;} }第四步创建动态代理的对象 Subject realSubject new RealSubject(); DynamicProxy proxy new DynamicProxy(realSubject); ClassLoader classLoader realSubject.getClass().getClassLoader(); Subject subject (Subject) Proxy.newProxyInstance(classLoader, new Class[]{Subject.class}, proxy); subject.visit();创建动态代理的对象需要借助Proxy.newProxyInstance。该方法的三个参数分别是 ClassLoader loader表示当前使用到的appClassloader。 Class?[] interfaces表示目标对象实现的一组接口。 InvocationHandler h表示当前的InvocationHandler实现实例对象。jdk自带动态代理 java.lang.reflect.Proxy 作用动态生成代理类和对象 java.lang.reflect.InvocationHandler(处理器接口) 可以通过invoke方法实现对真实角色的代理访问每次通过Proxy生成代理类对象时都指定对对应的处理器对象 3、Cglib代理 要实现Cglib代理必须引入cglib.jar 包由于Spring-core包中已经包含了cglib功能且大部分Java项目均引入了spring 相关jar包这边使用spring的cglib来讲解。他俩实现方式都是一样的 public class CglibProxy implements MethodInterceptor {//目标对象private Object obj;public CglibProxy(Object obj){this.objobj;}//给目标对象创建一个代理对象public Object getProxyInstance(){//1.工具类Enhancer en new Enhancer();//2.设置父类en.setSuperclass(obj.getClass());//3.设置回调函数en.setCallback(this);//4.创建子类(代理对象)return en.create();}Overridepublic Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {System.out.println(CglibProxy---------);return method.invoke(obj,objects);} }说明可以看出Cglib代理模式实现不需要目标对象一定实现接口故目标对象如果没有实现接口可以使用cglib代理模式。其实Spring的代理模式也是这么实现的。

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

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

相关文章

母婴行业网站建设创建免费网站需要的工具

注解目录 1.制冷设备的监测迫在眉睫 1.1 冷食的利润贡献 1.2 冷设监测系统的困难 (制冷设备对于便利店为何如何重要?了解一下你所不知道的便利店和新零售行业。关于电力线载波通信的论战。) 2、电路设计 2.1 防护电路 2.1.1 强电防护 …

网站 维护网站建设的整体流程有哪些

由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过…

电子商务网站建设开发呼市城乡建设厅网站

七、SpringBoot项目的打包与运行 1.目前项目怎么运行的 通过浏览器访问idea 将jar部署到服务器 2.maven 打包项目 命令 mvn package使用命令后会得到如下的jar 3.程序运行 命令 java -jar 项目.jar启动如下 4.springboot打包需要插件 插件 <plugin><group…

撰写网站的建设方案WordPress缺省图

如果想使用其他的qml文件直接创建对象&#xff0c;必须先这样导入其qml文件并as成别名&#xff0c;才可以创建对象并使用它。 一、导入qml文件&#xff0c;例如&#xff1a; import "CameraConfig.qml" as CameraConfig import "CameraDevelopView.qml" a…

做一般的网站要多久wordpress微商城插件

本文 我们来说两个page界面间的数据传递 路由跳转 router.pushUrl 之前我们用了不少了 但是我们只用了它的第一个参数 url 其实他还有个params参数 我们第一个组件可以编写代码如下 import router from ohos.router Entry Component struct Index {build() {Row() {Column() …

网站如何做快捷支付ui设计师是什么意思

为什么80%的码农都做不了架构师&#xff1f;>>> 在编译VC6.0是,出现fatal error C1010: unexpected end of file while looking for precompiled header directive 的错误. 解决方法&#xff1a; 1、如果发生错误的文件是由其他的C代码文件添加进入当前工程而引…

东莞网站设计及拍摄方案公司网站注册理由

linux系统中安装nginx到指定目录 下载要求版本的nginx源码包 上传并解压nginx源码包 # 在/opt/app目录下创建nginx解压安装目录 cd /opt/app mkdir nginx# 切换到解压目录下 cd /opt/app/nginx# 解压 tar -zxvf nginx-1.24.0.tar.gz编译安装 # 在/opt/app/nginx路径下&…

长春市做网站的公司制作短视频的软件

目录 摘 要 1 问题背景 2 模型假设 3 符号系统 4 问题 1 模型的建立与求解

如何查看网站收录情况沧州房产信息网

正题 题目大意 有n个东西&#xff0c;每个东西有价值和价格&#xff0c;然后要求一个价格上限&#xff0c;和除了第一个东西以外都有一个买这个之前必须要买的东西。 求最大价值 解题思路 我们考虑之前的树形背包 然后发现时间复杂度O(n3)O(n^3)O(n3)&#xff0c;之后我们考虑…

自建网站怎么做推广WordPress主题添加点赞喜欢按钮

描述 Python time strftime() 函数接收以时间元组&#xff0c;并返回以可读字符串表示的当地时间&#xff0c;格式由参数format决定。 语法 strftime()方法语法&#xff1a; time.strftime(format[, t]) 参数 • format – 格式字符串。 • t – 可选的参数t是一个struct_time对…

佛山市制作网站临沂建设质量监督站网站

当连接MariaDB/MySQL时&#xff0c;输入的密码会与期望的正确密码比较&#xff0c;由于不正确的处理&#xff0c;会导致即便是memcmp()返回一个非零值&#xff0c;也会使MySQL认为两个密码是相同的。也就是说只要知道用户名&#xff0c;不断尝试就能够直接登入SQL数据库。按照公…

wordpress 视频站主题互联网营销工具有哪些

拦截器——详细介绍 1. 介绍2. 类型3. 工作流程4. 作用5. 实现方式6. 配置使用7. 注意事项 1. 介绍 拦截器&#xff08;Interceptor&#xff09;是一种在软件设计中常用的设计模式&#xff0c;通常用于在方法的执行前后进行额外的处理&#xff0c;比如日志记录、鉴权、缓存等。…

购物商城网站郑州做定制网站的公司

以前发布网站都是定死网站放置路径的&#xff0c;现在JRT想面向更广范围推广&#xff0c;所以就不能明确确定网站放置目录&#xff0c;为此需要改造一下jrt命令和sh来满足目录不确定情况和多个程序用不同管理命令的要求。 以前是写死的&#xff0c;现在改为调程序运行目录的sh…

网站建设常州麦策电商购物网站界面设计

前言: &#x1f4a5;&#x1f388;个人主页:​​​​​​Dream_Chaser&#xff5e; &#x1f388;&#x1f4a5; ✨✨专栏:http://t.csdn.cn/oXkBa ⛳⛳本篇内容:c语言数据结构--树以及二叉树的概念与结构 目录 一.树概念及结构 1.树的概念 1.1树与非树 树的特点&#xff1…

德州网站网站建设wordpress怎么设置只显示摘要

1、自我推广 设计师有哪些副业&#xff1f;   正所谓&#xff1a;肥水不流外人田&#xff0c;身边朋友需要做海报logo设计什么的,肯定第一个想到的就是你&#xff0c;那么这里无非就两种情况&#xff1a;   一种情况就是朋友拿你当朋友&#xff0c;设计之前会问清相关…

沈阳市于洪区建设局网站恒锐奇 做网站

编写规范的项目流程图可以遵循以下步骤&#xff1a; 1.明确项目目标&#xff1a;首先&#xff0c;明确项目的目标以及需要实现的结果。这有助于确定项目的范围和要求。 2.识别项目任务&#xff1a;识别和列出所有的任务&#xff0c;这可以包括获得资源、实施动作、收集信息等…

网站网站设计公司网站上微信支付功能

注&#xff1a; 本系列仅为个人学习笔记&#xff0c;学习内容为《算法小讲堂》&#xff08;视频传送门&#xff09;&#xff0c;通俗易懂适合编程入门小白&#xff0c;需要具备python语言基础&#xff0c;本人小白&#xff0c;如内容有误感谢您的批评指正 汉诺塔&#xff08;To…

望城区网站建设中国外贸数据网

目录 一 第三方资源配置管理1 管理DataSource连接池对象问题导入1.1 管理Druid连接池1.2 管理c3p0连接池 2 加载properties属性文件问题导入2.1 基本用法2.2 配置不加载系统属性2.3 加载properties文件写法 二 Spring容器1 Spring核心容器介绍问题导入1.1 创建容器1.2 获取bean…

建e网站wordpress在快速编辑加自定义字段

介绍 有许多种方式可以用来考虑构建应用的类型&#xff0c;通常类型用来描述一个特定的执行模型或者基于此的应用。举例说&#xff1a;控制台应用&#xff08;Console Application&#xff09;、Web应用&#xff08;Web Application&#xff09;等等。所有这些类型的应用都可以…