java设计模式
简单工厂模式
- 思想
- 当你有很多类似的类需要实例化的时候,你可以建造一个工厂,让工厂来生产(实例化)它们
- 举例
- 自定义了很多异常,每次程序运行出错都需要生成不同类型的异常,我们可以用异常工厂来生产这些异常
- 你是一个身怀满技的工人,想制作电脑做生意,但是电脑制作工艺更新太快,一个人学不过来,所以开一家工厂,让工厂来生产电脑,这样你就不用学这么多电脑制作的知识了。你只需要吩咐工厂生产。
工厂模式
- 思想
- 建立在简单工厂的思想下,我们把具体工厂生产实例的方法抽象出来,再建一个抽象型的工厂,用于制定生产规范
- 举例
- 你现在有了一家生产电脑的大工厂,专门生产各种类型的电脑。后来,这家工厂太大,生产的电脑型号也太多,你为了管理和分工方便,把工厂拆分成苹果电脑工厂,平板电脑工厂,普通电脑工厂三家工厂,然后再创建一个工厂监制会,专门统一每个工厂必须要有的流程和加工。然后每个工厂都按照监制会的标准去生产不同类型的电脑。
单例模式
思想
- 这个世界上有些东西是独一无二的,我们必须保证它只能有一个实例。
特征
- 单例类只能有一个实例
- 单例类必须自行创建自己的唯一的实例
- 单例类必须给所有其他对象提供这一实例
Singleton
(单例):在单例类的内部实现只生成一个实例,同时它提供一个静态的getInstance()
方法,让使用者可以访问它的唯一实例- 为了防止在外部对其实例化,将其构造函数设计为
私有
- 在单例类内部定义了一个
Singleton
类型的静态对象,作为外部共享的唯一实例。
举例
- 你是个好男人,把工厂赚的钱都给了老婆,但是老婆只能有一个
实现方式
线程不安全
1
2
3
4
5
6
7
8
9
10public class Singleton {
private static Singleton instance;
private Singleton (){}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}synchronized 更多
- Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。
用法
- 修饰一个类,其作用的范围是synchronized后面括号括起来的部分,作用的对象是这个类的所有对象
- 修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象
- 修改一个静态的方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象
- 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象
线程安全
1
2
3
4
5
6
7
8
9
10public class Singleton {
private static Singleton instance;
private Singleton (){}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
建造者模式
- 思想
- 在工厂模式下,多了一层导演者。可以简单理解成用户做一件事情,会先找外包公司,而不是直接找工厂。外包公司会根据用户的需求来选择合适的工厂来生产。
- 举例
- 后来你年纪大了,工厂的事情管的太累,所以你让邀请一个人当这家公司的CEO,你当董事局主席。工厂的业务都是CEO来负责,无论多开了几家工厂,和你都没有关系。你有事的话就吩咐CEO就好。
适配器模式
- 思想
- 我们笔记本用的到充电器其实就是个适配器,笔记本电脑的工作电压是20V,而我国的家庭用电是220V,如何让20V的笔记本电脑能够在220V的电压下工作?就是靠这个充电器搞定的。在软件开发中,有时也存在类似这种不兼容的情况,我们也可以像引入一个电源适配器一样引入一个称之为适配器的角色来协调这些存在不兼容的结构,这种设计方案即为适配器模式。
- 举例
- 你的公司遇到互联网大潮,需要转型到线上销售,但是你原来的公司没有电商部门,只有线下销售,所以你花重金请来了一个电商团队,帮你协调线上和线下的联合销售。
学习资料
数据库
主键
关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键比如 :
学生表(学号,姓名,性别,班级)
其中每个学生的学号是唯一的,学号就是一个主键。
用户表(用户名、密码、登录级别)
其中用户名是唯一的, 用户名就是一个主键。
总之主键是能确定一条记录的唯一标识。
外键
外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性。比如,A表中的一个字段,是B表的主键,那他就可以是A表的外键。
基本的增删改查
- 增加:insert into table1(field1,field2) values(value1,value2)
- 删除:delete from table1 where 范围
- 更新:update table1 set field1=value1 where 范围
- 查询:select field1,field2 from table1 where 范围
JDBC
准备
导入相应jar包
使用步骤
第一步:加载驱动类通过,java.lang.Class的静态方法forName(String className)实现
1 | Class.forName("com.mysql.jdbc.Driver");//这行语句需要捕获,也就是加上try catch |
第二步:创建数据库的连接
- 要连接数据库,需要向java.sql.DriverManager请求并获得Connection对象, 该对象就代表一个数据库的连接。使用DriverManager的getConnectin(String url , String username , String password )方法传入指定的欲连接的数据库的路径、数据库的用户名和密码来获得。
1 | String url = "jdbc:mysql://localhost:3306/数据库名称" ; |
第三步:创建语句
个人不推荐使用Statement,容易发生SQL注入的问题,推荐使用PreparedStatement,可以预编译数据库语句。
1 | String sql = "select field1, field2, field3 from table1" |
第四步:关闭JDBC对象
操作完成以后要把所有使用的JDBC对象全都关闭,以释放JDBC资源,关闭顺序和声明顺序相反
1 | try { |
FTP
- 介绍
- FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。在FTP的使用当中,用户经常遇到两个概念:”下载”和”上传”。”下载”文件就是从远程主机拷贝文件至自己的计算机上;”上传”文件就是将文件从自己的计算机中拷贝至远程主机上。用Internet语言来说,用户可通过客户机程序向(从)远程主机上传(下载)文件。
- ftp地址
- ftp://www.maijinta.top
- 账号:admin
- 密码:000000
- ftp和http的区别
- Http,FTP是应用层协议,HTTP用来传输超文本而FTP用来传文件
Linux
简介
Linux是一种比Windows更加稳定,免费,性能高的操作系统。它被广泛用在服务器领域和移动端,比如安卓系统和嵌入式系统开发,所以我们学习网站开发,必须了解,并掌握Linux。
特点
- 在linux中,一切设备,一切软硬件都被看作是文件。
- linux区分大小写
- #(表示超级用户)
- $(表示普通用户)
- 命令的参数可以一起使用,如
mkdir -vp
常用命令
查看当前目录的绝对路径:pwd
清屏:clear
路径补全:tab
键
测试网络是否连通:ping
1 | ping www.baidu.com #向百度发送数据包,回收数据包 |
远程访问服务器:ssh
1 | ssh root@172.11.1.67 #用root用户来登录远程服务器,然后会提示你输入密码 |
查看时间:date
1 | 返回 |
查看日期:cal
查看有哪些用户登录了系统:who
查看当前是哪个用户登录了系统:whoami
查看历史命令:history
查看命令帮助:whatis
,info
,which
,man
,--help
1 | 使用方法 |
查文件或目录的大小:du
1 | du -h 文件名 |
查看文件与目录的命令:ls
1 | ls -l #列出长数据串,包含文件的属性与权限数据等,可以简写成:ll |
切换目录:cd
1 | cd # 切换到初始目录下 |
覆盖文件内容:echo
1 | 使用>指令覆盖文件原内容并重新输入内容,若文件不存在则创建文件。 |
创建文件:touch
1 | touch 文件名 |
创建文件夹:mkdir
1 | mkdir 文件夹 #创建文件夹 |
删除空目录:rmdir
1 | 例如 |
搜寻指定的字符串:grep
1 | grep "<string>" <file-name> |
查找某目录下文件:find
1 | 与时间有关的参数: |
复制文件:cp
1 | cp -a #将文件的特性一起复制,相当于 -pdr 的意思 |
远程复制文件(夹):scp
1 | 必须在本地使用中这条命令,不能在服务器上用 |
移动文件,目录或重命名:mv
1 | -f #force强制的意思,如果目标文件已经存在,不会询问而直接覆盖 |
注:该命令可以把一个文件或多个文件一次移动一个文件夹中,但是最后一个目标文件一定要是“目录”。
删除文件或目录:rm
1 | rm -f #就是force的意思,忽略不存在的文件,不会出现警告消息 |
获取进程运行情况:ps
1 | ps -A #所有的进程均显示出来 |
显示CPU占用量较大的进程:top
1 | top #top命令会默认按照CPU的占用情况,显示占用量较大的进程 |
判断文件的基本数据:file
1 | file filename |
因为在Linux下文件的类型并不是以后缀为分的,所以这个命令对我们来说就很有用了
对文件进行打包:tar
1 | tar -c :新建打包文件 |
注:
- 默认情况并不会压缩,如果指定了相应的参数,它还会调用相应的压缩程序(如gzip和bzip等)进行压缩和解压
- 文件名并不定要以后缀tar.bz2结尾,这里主要是为了说明使用的压缩程序为bzip2
查看文件的内容:more
,less
,cat
,head
,tail
1 | more 文件名 #按回车一行,空格一页。不能向上下翻行。 |
- cat命令可以一次显示整个文件,如果文件比较大,使用不是很方便;
- more命令可以让屏幕在显示满一屏幕时暂停,此时可按空格健继续显示下一个画面,或按Q键停止显示。
- less命令也可以分页显示文件,和more命令的区别就在于它支持上下键卷动屏幕,当结束浏览时,只要在less命令的提示符“: ”下按Q键即可。
改变文件所属用户组:chgrp
1 | chgrp 组名 文件名 |
改变文件的所有者:chown
1 | 更改单个文件的属主: |
改变文件的权限:chmod
1 | chmod 权限 文件名 |
文本编辑:vim
,vi
1 | Vim是从 vi 发展出来的一个文本编辑器 |
更多命令
Git
简介
Git是目前世界上最先进的分布式版本控制系统,以其优秀的控制能力独傲全球
集中式版本控制系统-SVN,CVS
版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,如果在互联网下,如果网速慢的话,就纳闷了。
分布式版本控制系统-Git
分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
Git学习笔记
window下配置SSH连接GitHub、GitHub配置ssh key
Git命令
- workspace: 本地的工作目录。(记作A)
- index:缓存区域,临时保存本地改动。(记作B)
- local repository: 本地仓库,只想最后一次提交HEAD。(记作C)
- remote repository:远程仓库。(记作D)
1 | 初始化 |
Git忽略文件
在git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改根目录中 .gitignore 文件的方法(如无,则需自己手工建立此文件)
1 | Git 中的文件忽略 |
Git使用规范提醒
- 使用Git过程中,必须通过创建分支进行开发,坚决禁止在主干分支上直接开发。review的同事有责任检查其他同事是否遵循分支规范。
- 在Git中,默认是不会提交空目录的,如果想提交某个空目录到版本库中,需要在该目录下新建一个 .gitignore 的空白文件,就可以提交了
- 把外部文件纳入到自己的 Git 分支来的时候一定要记得是先比对,确认所有修改都是自己修改的,然后再纳入。不然,容易出现代码回溯
- 多人协作时,不要各自在自己的 Git 分支开发,然后发文件合并。正确的方法应该是开一个远程分支,然后一起在远程分支里协作。不然,容易出现代码回溯(即别人的代码被覆盖的情况)
- 每个人提交代码是一定要 git diff 看提交的东西是不是都是自己修改的。如果有不是自己修改的内容,很可能就是代码回溯
- review 代码的时候如果看到有被删除掉的代码,一定要确实是否是写代码的同事自己删除的。如果不是,很可能就是代码回溯
Git使用规范
Git 使用规范流程 - http://www.ruanyifeng.com/blog/2015/08/git-use-process.html
团队中的 Git 实践 - https://ourai.ws/posts/working-with-git-in-team/
构家网 git 团队协作使用规范 v2 - http://wenku.baidu.com/view/e1430d1b7f1922791788e81e
扩展阅读
Git Book - https://git-scm.com/book/zh/
git简明指南 - http://rogerdudler.github.io/git-guide/index.zh.html
常用 Git 命令清单 - http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html
猴子都能懂的GIT入门 - http://backlogtool.com/git-guide/cn/
缪雪峰Git教程 - http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000