设计模式--创建型模式之建造者设计模式
设计模式–创建型模式之建造者设计模式 事实上,在平时编写代码时,我们通常都会忽略对象的复杂性,优先考虑使用工厂模式创建对象,而不是建造者模式。因为工厂模式和建造者模式的作用都是创建一个产品对象,相对于建造者模式来说,工厂模式没有抽象建造者和指挥者,所以结构更加简洁直接,因此更常使用。
1.1. 模式动机 无论是在现实世界中还是在软件系统中,都存在一些复杂的对象,它们拥有多个组成部分,如汽车,它包括车轮、方向盘、发送机等各种部件。而对于大多数用户而言,无须知道这些部件的装配细节,也几乎不会使用单独某个部件,而是使用一辆完整的汽车,可以通过建造者模式对其进行设计与描述,建造者模式可以将部件和其组装过程分开,一步一步创建一个复杂的对象。用户只需要指定复杂对象的类型就可以得到该对象,而无须知道其内部的具体构造细节。
在软件开发中,也存在大量类似汽车一样的复杂对象,它们拥有一系列成员属性,这些成员属性中有些是引用类型的成员对象。而且在这些复杂对象中,还可能存在一些限制条件,如某些属性没有赋值则复杂对象不能作为一个完整的产品使用;有些属性的赋值必须按照某个顺序,一个属性没有赋值之前 ...
设计模式--创建型模式之抽象工厂设计模式
设计模式–创建型模式之抽象工厂设计模式1.1. 模式动机
在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法也具有唯一性,一般情况下,一个具体工厂中只有一个工厂方法或者一组重载的工厂方法。但是有时候我们需要一个工厂可以提供多个产品对象,而不是单一的产品对象。
为了更清晰地理解工厂方法模式,需要先引入两个概念:
产品等级结构 :产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是其子类。
产品族 :在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中。
当系统所提供的工厂所需生产的具体产品并不是一个简单的对象,而是多个位于不同产品等级结构中属于不同类型的具体产品时需要使用抽象工厂模式。
抽象工厂模式是所有形式的工厂模式中最为抽象和最具一般性的一种形态。
抽象工 ...
设计模式--工厂方法设计模式
设计模式–创建型模式之工厂方法设计模式1.1. 模式动机现在对该系统进行修改,不再设计一个按钮工厂类来统一负责所有产品的创建,而是将具体按钮的创建过程交给专门的工厂子类去完成,我们先定义一个抽象的按钮工厂类,再定义具体的工厂类来生成圆形按钮、矩形按钮、菱形按钮等,它们实现在抽象按钮工厂类中定义的方法。这种抽象化的结果使这种结构可以在不修改具体工厂类的情况下引进新的产品,如果出现新的按钮类型,只需要为这种新类型的按钮创建一个具体的工厂类就可以获得该新按钮的实例,这一特点无疑使得工厂方法模式具有超越简单工厂模式的优越性,更加符合“开闭原则”。
1.2. 模式定义工厂方法模式(Factory Method Pattern)又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式,它属于类创建型模式。在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。
1.3. 模式结 ...
布隆过滤器
布隆过滤器(BloomFilter)引言 我们经常会将一部分数据放在redis等缓存中,比如产品信息。这样有查询请求进来,我们就可以根据产品id直接去缓存中取得数据,如果没有再去读取数据库,再将数据放入缓存,再返回数据,大大减少了访问数据库的次数,这是提升性能最普遍的方式。
但是如果现在有大量的请求进来,而且都在请求一个不存在的id,就会导致大量的请求去访问数据库,而数据库对于不存在的id是需要遍历整个表之后返回一个null的,这样大量的请求访问数据库,很大可能导致数据库宕机,
这时我们急需一个解决方案,在无效id访问缓存的之前就判断该id不存在。布隆过滤器就是一个很好的选择。
背景及意义 布隆过滤器(英语:Bloom Filter)是 1970 年由一个叫做布隆的老哥提出的。它底层实际上是一个很长的bit数组和一系列随机映射函数。主要用于判断一个元素是否在一个集合中。
通常我们会遇到很多要判断一个元素是否在某个集合中的业务场景(比如缓存场景),一般想到的是将集合中所有元素保存起来,然后通过比较确定。链表、树、散列表(又叫哈希表,Hash tabl ...
Docker
Docker简介Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
为什么会有Docker的出现项目部署的问题大型项目组件较多,运行环境也较为复杂,部署时会碰到一些问题:
依赖关系复杂,容易出现兼容性问题
开发、测试、生产环境有差异
传统上认为,软件编码开发/测试结束后,所产出的成果即是程序或是能够编译执行的二进制字节码等(Java为例)。而为了让这些程序可以顺利的执行,开发团队也得准备完成的部署文件,让运维团队得以部署应用程序,开发需要清楚的告诉运维部署团队,用的全部配置文件+所有软件环境。不过即便如此,任然常常发生部署失败的状况。Docker的出现使得Docker得以打破过期【程序即应用】的观念。通过镜像(images)将作业系统核心除外,运作应用程序所需要的系统环境,由下 ...
设计模式----创建型模式之简单工厂设计模式
设计模式—-创建型模式之单例设计模式1.1. 模式动机对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管理器或文件系统;一个系统只能有一个计时工具或ID(序号)生成器。
如何保证一个类只有一个实例并且这个实例易于被访问呢?定义一个全局变量可以确保对象随时都可以被访问,但不能防止我们实例化多个对象。
一个更好的解决办法是让类自身负责保存它的唯一实例。这个类可以保证没有其他实例被创建,并且它可以提供一个访问该实例的方法。这就是单例模式的模式动机。
1.2. 模式定义单例模式(Singleton Pattern):单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。
单例模式的要点有三个:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。单例模式是一种对象创建型模式。单例模式又名单件模式或单态模式。
1.3. 模式结构单例模式包含如下角色:
Singleton:单例
1.4. 时序图
1.5. 代码 ...
JavaScript
JavaScriptJavaScript 是 web 开发人员必须学习的 3 门语言中的一门:
HTML 定义了网页的内容
CSS 描述了网页的布局
JavaScript 控制了网页的行为
简介
JavaScript 能够改变 HTML 内容
getElementById() 是多个 JavaScript HTML 方法之一。
本例使用该方法来“查找” id=”demo” 的 HTML 元素,并把元素内容(innerHTML)更改为 “Hello JavaScript”:
<h2>JavaScript 起步</h2> <p id="demo">JavaScript 能够改变HTML内容.</p> <button type="button" onclick='document.getElementById("demo").innerHTML="Hello JavaScript"'>点击我 & ...
CSS
CSS层叠样式表简介但用HTML写一个页面并不够美观,并且HTML也并不适合用来做简单的样式。
CSS:网页的美容师
CSS语法规范使用HTML时,需要遵从一定的规范,CSS也是如此。想要熟练地使用CSS对网页进行修饰,首先需要了解CSS样式规则
CSS 规则集(rule-set)由选择器和声明块组成:
选择器指向您需要设置样式的 HTML 元素。
声明块包含一条或多条用分号分隔的声明。
每条声明都包含一个 CSS 属性名称和一个值,以冒号分隔。(键值对)
多条 CSS 声明用分号分隔,声明块用花括号括起来。
CSS代码风格风格并非强制规范,而是符合实际开发书写方式
样式格式书写
样式大小写风格
样式空格风格
样式格式书写
样式大小写风格
样式空格风格
CSS选择器作用选择器(选择符)就是根据不同的需求把不同的标签选择出来这就是选择器的作用。简单来说,就是选择标签用的。
以上CSS做了两件事:
找到所有的h1标签。选择器(选对人)。
设置这些标签的样式,比如颜色为红色(作对事)。
选择器分类我们可以将 CSS 选择器分为五类:
简单选择器:(根据名称、 ...
HTML
HTML简介 这里主要用于自己学习前端过程中的一些比较难记的知识点或是容易出错的地方,所以内容不是那么完整。一些基础的标签建议之间看文档知道意思就行了。在学习其他的内容的过程中会使用,此时就可以练习加深印象。
表格
表格主要用于展示数据
表格所有内容都应该包含在<table>标签中
表头应该包含在<thead>(语义标签)中
表体应该包含在<tbody>(语义标签)中
表位应该包含在<tfoot>(语义标签)中
<tr>表示表中的一行是比<table>低一级的
<th>表格头,内容居中,加粗显示
<td>普通表格,内容左对齐
【注意】:浏览器一般是通过加载全部表格数据后才显示,但是当数据量很大时,希望能加载一部分,即显示一部分??
— 使用 带结构的表格!!! 即使用 三个标签
【注意】:如果需要单元格合并???—使用 跨列属性colspan、rowspan
<!DOCTYPE html><html lang="en"&g ...
Filter
Filter简介Filter是对客户端访问资源的过滤,符合条件的放行,不符合条件的不放行,并且可以对目标资源访问前后进行逻辑处理的一个组件。
过滤器的作用 Java过滤器是处于客户端与服务器资源文件之间的一道过滤网,在访问资源文件之前,通过一系列的过滤器可以对请求进行修改、判断等,把不符合规则的请求在中途拦截或修改;也可以对响应进行过滤,拦截或修改响应。例如:修改响应体或是请求体的字符集。
快速入门
步骤:
使用Maven创建一个Web项目
导入javax.servlet-api依赖
编写一个过滤器继承Filter执行过滤操作
编写一个Servlet继承HttpServlet执行业务处理操作
在web.xml/注解中进行配置(配置servlet 和 filter )
CharsetFilter.java
public class CharsetFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletExc ...