23设计模式学习

1.什么设计模式

  • 1.1模式是解决相似问题的核心
  • 1.2设计模式软件设计过程中解决一类问题的方案
  • 总结来说:设计模式 :软件设计过程中解决一类问题的一种方案;

2.什么是面向对象的设计模式

面向对象设计模式描述了面向对象设计过程中、特定场景下、类与相互通信的对象之间常见的组织关系、

面向对象的实现过程如下:

  • 2.1 首先是抽象出类
  • 2.2 然后设计出对象之间的关系

3.设计原则:

 3.1 针对接口(抽象)编程,而不是针对实现编程;

 3.2 优先使用组合 而不是使用类的继承

 3.3封装变化点

 3.4 使用重构得到模式

4.模式

4.1 单例模式

单例模式分为:懒汉模式和饥汉模式

  区别:懒汉模式是使用时才创建

             饥汉模式是类初始化时加载

 

使用双检验模式

package com.asiainfo.test;import java.util.HashMap;public class Singleton {private static volatile Singleton singleton=null;private Singleton() {}//防止在其他类中创建实例public static Singleton getInstance() {HashMap<String, String> hashMap = new  HashMap<String,String>();if (singleton == null) {   //防止已经创建实例,线程进来,有枷锁和释放锁过程,造成cup 资源的浪费synchronized (Singleton.class) {//枷锁,两个线程同时进来,其中一个线程能获得锁,另一个线程只能等待if (singleton == null) {    //若两个线程都到synchronized ()这块,这个判空就能防止,后面的那个线程在次创建一个实例singleton = new Singleton();System.out.println("进来了");}}}return singleton;}
}

 

 静态加载这种方式:

package com.asiainfo.test;public class SingletonStatic {public static int a=10;public static volatile SingletonStatic singleton=null;static {singleton=new SingletonStatic();//利用静态代码块实例化类System.out.println("this  si a static {}");}private  SingletonStatic(){ //防止其他类 实例化单例模式System.out.println("this is singletonStatic");}private static SingletonStatic getSingleton(){//获取单例System.out.println( "this is a static method");return singleton;}public static void main(String[] args) {System.out.println(a);getSingleton();SingletonStatic singletonStatic = new SingletonStatic();}}

运行结果:

this is singletonStatic
this  si a static {}
10
this is a static method
this is singletonStatic

  总结:

概括的说:静态代码块在类加载时调用,并且只调用一次。
静态代码块最常用的作用就是:给一个对象的属性初始化。

具体的说:

  • 1.当调用一个类的静态变量时,这个类中的静态代码块会执行。【只有静态代码块会执行】
  • 2.当调用一个 类的静态方法时,这个类中的静态代码块会执行。【只有静态代码块会执行】
  • 3.当创建一个 类的一个实例时,这个类中的静态代码块、非静态代码块(也叫构造代码块)、创建实例的相应的构造方法都会执行。

具体类的执行顺序参考:https://mp.csdn.net/postedit/81100790

由于使用静态加载staic{} 方式 ,只要调用单例的 静态变量,或者方法就会执行静态代码块,不是最优的方式

建议使用延迟加载:

该方法中Singleton 有一个静态内部类SingletonHolder,内部类在外部加载的时候并不会加载,在有在调用getInstance才会加载

package com.asiainfo.test;public class InternalSingleton {private InternalSingleton() {}private static class SingletonHolder {//该方法中Singleton 有一个静态内部类SingletonHolder,内部类在外部加载的时候并不会加载,在有在调用getInstance才回加载private static final InternalSingleton inst = new InternalSingleton();static {System.out.println("this internal static ");}}public static InternalSingleton getInstance() {return SingletonHolder.inst;}public static void sayHello(){System.out.println("this  is  hello");}public static void main(String[] args) {InternalSingleton.sayHello();getInstance();}
}

运行结果:

this  is  hello
this internal static 

 总结:

§Singleton模式是限制而不是改进类的创建。

§理解和扩展Singleton模式的核心是“如何控制用户使用new对一个类的构造器的任意调用”。

可以很简单的修改一个Singleton,使它有少数几个实例,这样做是允许的而且是有意义的。 

4.2 建造者builder模式

 Builder模式定义: 
   将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.

 Builder partA()

 Builder partB()

 Builder partC()

 ConcreteBuilder 中的 Builder part()表示产品组件具体组件实现

 Director 类中Construct() 完成组件拼装;而不是在 concreteBuilder 中的getResult() 方法中完成,而实现了解耦过程部件

 

 具体实例参考如下地址

 参考:https://www.jianshu.com/p/be290ccea05a

4.3.工厂模式包含:单工厂模式,工厂方法,抽象工程

  • 简单工厂:一种产品---一个工厂
  •  工厂          一种产品-----多个工厂
  •  抽象工厂    多种产品 ----多个工厂

抽象工厂如下图:

 

 

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

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

相关文章

修改linux的最大文件句柄数限制

修改linux的最大文件句柄数限制 对于一般的应用来说(象Apache、系统进程)1024完全足够使用。但是如何象squid、mysql、java等单进程处理大量请求的应用来说就有点捉襟见肘了。如果单个进程打开的文件句柄数量超过了系统定义的值&#xff0c;就会提到“too many files open”的…

人工智能课程

清华大学计算机博士联合智能社创始人年末巨献&#xff0c;【机器学习】大型线上公开课&#xff0c;报名人数超过2800人&#xff0c;课程观看地址&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1nv66ywD 密码&#xff1a;9bv3想看更多课程的联系:qq:1126137994微信&…

Makefile工程管理语法与使用技巧

使用GNU Make工具来管理程序是每个Linux工程师必须掌握的技能。Make能够使整个程序的编译、链接只需要一个命令(make)就可以完成。 Make的工作主要依赖于一个叫为Makefile的件。Makefile文件描述了整个程序的编译&#xff0c;连接等规则。其中包括&#xff1a;工程中的哪些源文…

JUC 知识总结

在 ThreadPoolExecutor 里面定义了 4 种 handler 策略&#xff0c;分别是 1. CallerRunsPolicy &#xff1a;这个策略重试添加当前的任务&#xff0c;他会自动重复调用 execute() 方法&#xff0c;直到成功。 2. AbortPolicy &#xff1a;对拒绝任务抛弃处理&#xff0c;并且…

C# java 有关“字节序”的描述 .

有关“字节序”的描述 收藏 BIG-ENDIAN&#xff08;大字节序、高字节序&#xff09; LITTLE-ENDIAN&#xff08;小字节序、低字节序&#xff09; 主机字节序 网络字节顺序 JAVA字节序 1&#xff0e;BIG-ENDIAN、LITTLE-ENDIAN跟多字节类型的数据有关的比如int,short,long型&…

移植u-boot-2012.04.01到jz2440开发板

今天我给大家分享一下如何移植一个纯净的uboot到jz2440开发大版&#xff0c;通过记录学习分享&#xff0c;与大家一起进步&#xff01;&#xff01;&#xff01; 1.首先我们在uboot官网下载u-boot-2012.04.01.tar.bz2&#xff0c;建立source insight工程。将下载好的uboot通过…

温习了一下java线程状态方面的知识总结一

好长时间没有复习线程状态这块&#xff0c;读并发编程实战正好看着这块&#xff0c;顺便复习一下&#xff1a; 1.线程的五种状态&#xff1a; 2.线程五种状态的转换图&#xff1a; wait()会立刻释放synchronized(obj)中的锁以便其它线程可以执行obj.notify 但是notify() 不会立…

WinForm:进度条的实现(异步)

在WinForm中经常遇到一些费时的操作界面&#xff0c;比如统计某个磁盘分区的文件夹或者文件数目&#xff0c;如果分区很大或者文件过多的话&#xff0c;处理不好就会造成“假死”的情况&#xff0c;或者报“线程间操作无效”的异常&#xff0c;为了解决这个问题&#xff0c;可以…

移植u-boot-2012.04.01到jz2440开发板之修改代码支持NAND启动

上一篇文章我们已经修改了uboot源码使其能够正常打印输出了&#xff0c;但是输出停到了nand启动那里&#xff0c;所以这篇文章就来记录如何修改源码使uboot支持NAND启动。 原来的代码在链接时加了”-pie”选项, 使得u-boot.bin里多了”(.rel)”, “*(.dynsym)”使得程序非常大…

XMLHttpRequest() 请求 返回结果JSON 对象与JSON 字符串处理

好久没有看JavaWEB项目了突然拿起来&#xff0c;而且是原生的项目&#xff0c;中JSON 字符串的处理 json.stingfy() 将对象&#xff0c;数组转换为字符串&#xff0c;json.parse() 将字符串转成json 对象JSON.stringify&#xff08;数组或者对象&#xff09; JSON.parse(字符串…

【C++深度剖析教程4】C++的二阶构造模式

今天学习的是C中的二阶构造模式&#xff0c;二阶构造模式只是设计模式中的简单的模式&#xff0c;是一种软件设计的方法&#xff0c;并没有我们想象的那么高深&#xff0c;设计模式也是一样&#xff0c;只不过是一系列的设计方法&#xff0c;只要我们懂得了原理&#xff0c;那么…

获取应用程序根路径

public string GetRootURI(){string UrlAuthority Request.Url.GetLeftPart(UriPartial.Authority);if (Request.ApplicationPath null || Request.ApplicationPath "/"){//直接安装在Web站点return UrlAuthority;}else{//安装在虚拟子目录下return UrlAuthority …

JQuery 中选择多选择框,和单选框,实现获取相应选择的值

好久没有弄前端了&#xff0c;还是记一下&#xff1a;建议大家学习时&#xff0c;深入学习一样知识&#xff0c;可以涉猎很多 获取单选按钮的值&#xff1a; $(document).ready(function() { $.ajax({//url:base_url"/login/login.do",url:"url地址",type…

【C++深度剖析教程5】C++中类的静态成员函数

学习交流加&#xff08;可免费帮忙下载CSDN资源&#xff09;&#xff1a;个人微信&#xff1a; liu1126137994学习交流资源分享qq群1&#xff08;已满&#xff09;&#xff1a; 962535112学习交流资源分享qq群2&#xff08;已满&#xff09;&#xff1a; 780902027学习交流资源…

Lucene:基于Java的全文检索引擎简介

(转自http://hi.baidu.com/sz_xiaofeng/blog/item/7f3c33ed033444d1b31cb1b2.html)Lucene是一个基于Java的全文索引工具包。 基于Java的全文索引引擎Lucene简介&#xff1a;关于作者和Lucene的历史全文检索的实现&#xff1a;Luene全文索引和数据库索引的比较中文切分词机制简介…

eclipse 工程中使用引入maven项目遇到maven-resources-plugin:2.6 找不到

1.开始eclipse 配置本地库 首先是从maven 官网下载maven 组件 其次是配置 maven 环境和java 配置jdk 类似这里就不做介绍了 配置完环境后修改\apache-maven-3.3.9\conf\settings.xml 中的<localRepository> 设置本地仓库 然后配置eclipse 下面图中执行较为重要&#xff…

移植uboot之修改代码支持NorFlash记录

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 今天我们的任务是修改uboot源码支持NorFlash。 上两篇关于uboot移植的文章&#xff0c;我们修改了uboot源代码&#xff0c;支持了串口的输出&#xff…

保持一颗好学之心

保持一颗好学之心 初见这个题目&#xff0c;许多人可能会对自己相当满意&#xff1a;“我还是很好学的”。真的是这样吗&#xff1f;个人之见&#xff0c;有不少人其实并不像他们想象的那么好学&#xff0c;尤其是那些有了一定经验&#xff0c;在某些方面有些过人之处的“聪明”…

Vue.js 学习

后端和数据库角色&#xff0c;确参加了前端培训&#xff0c;哪就总结一下&#xff1a;后续继续更新 1.首先是vue.js 与jquery 的比较 vue.js 是采用数据和dom元素分类&#xff0c;采用的VMMV 模式 V view 视图 M Model 存放数据&#xff0c;VM 在M和V 主要是处理一些业务逻辑…