原型模式-Prototype Pattern【学习难度:★★★☆☆,使用频率:★★★☆☆】

该博文是转载LoveLion的博客,在其基础上,将HTML改写为Markdown。在原博文中,作者已经给每个模式都设计了一个实现代码,我已经将代码全部实现,做了一定修改放到了Github中,大家可以clone看一下实现效果,加强印象。
Github地址:https://github.com/tracylihui/design_pattern
原文链接:史上最全设计模式导学目录(完整版)

张纪中版《西游记》以出乎意料的造型和雷人的台词遭到广大观众朋友的热议,我们在此对该话题不作过多讨论。但无论是哪个版本的《西游记》,孙悟空都是其中的一号雄性主角,关于他(或它)拔毛变小猴的故事几乎人人皆知,孙悟空可以用猴毛根据自己的形象,复制(又称“克隆”或“拷贝”)出很多跟自己长得一模一样的“身外身”来。在设计模式中也存在一个类似的模式,可以通过一个原型对象克隆出多个一模一样的对象,该模式称之为原型模式。

阅读更多

单例模式-Singleton Pattern【学习难度:★☆☆☆☆,使用频率:★★★★☆】

该博文是转载LoveLion的博客,在其基础上,将HTML改写为Markdown。在原博文中,作者已经给每个模式都设计了一个实现代码,我已经将代码全部实现,做了一定修改放到了Github中,大家可以clone看一下实现效果,加强印象。
Github地址:https://github.com/tracylihui/design_pattern
原文链接:史上最全设计模式导学目录(完整版)

单例模式的动机


对于一个软件系统的某些类而言,我们无须创建多个实例。举个大家都熟知的例子——Windows任务管理器,如图3-1所示,我们可以做一个这样的尝试,在Windows的“任务栏”的右键弹出菜单上多次点击“启动任务管理器”,看能否打开多个任务管理器窗口?如果你的桌面出现多个任务管理器,我请你吃饭,微笑(注:电脑中毒或私自修改Windows内核者除外)。

阅读更多

抽象工厂模式-Abstract Factory Pattern【学习难度:★★★★☆,使用频率:★★★★★】

工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问题,但由于工厂方法模式中的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,势必会增加系统的开销。此时,我们可以考虑将一些相关的产品组成一个“产品族”,由同一个工厂来统一生产,这就是我们本文将要学习的抽象工厂模式的基本思想。

阅读更多

工厂方法模式-Factory Method Pattern【学习难度:★★☆☆☆,使用频率:★★★★★】

简单工厂模式虽然简单,但存在一个很严重的问题。当系统中需要引入新产品时,由于静态工厂方法通过所传入参数的不同来创建不同的产品,这必定要修改工厂类的源代码,将违背“开闭原则”,如何实现增加新产品而不影响已有代码?工厂方法模式应运而生,本文将介绍第二种工厂模式——工厂方法模式。

阅读更多

简单工厂模式-Simple Factory Pattern【学习难度:★★☆☆☆,使用频率:★★★☆☆】

工厂模式是最常用的一类创建型设计模式,通常我们所说的工厂模式是指工厂方法模式,它也是使用频率最高的工厂模式。本章将要学习的简单工厂模式是工厂方法模式的“小弟”,它不属于GoF 23种设计模式,但在软件开发中应用也较为频繁,通常将它作为学习其他工厂模式的入门。此外,工厂方法模式还有一位“大哥”——抽象工厂模式。这三种工厂模式各具特色,难度也逐个加大,在软件开发中它们都得到了广泛的应用,成为面向对象软件中常用的创建对象的工具。

阅读更多

概述


加密

我们在用户模块,对于用户密码的保护,通常都会进行加密。从最简单来说,小明盗取了你的数据库信息(小明躺枪),但由于你对你数据库中的用户信息的密码是加密的(我们假设加密之后的密文是无法破解的),那小明即使得到信息也没法进行登录。这是最最基本的一点防范措施。

我们通常的做法是,用户在提交注册信息时,在后台的业务逻辑中将密码进行加密(例如采用MD5或者BCrypt加密算法),所以存放在数据库中的信息为加密之后的密文。例如,如果小红在你的系统中注册了自己的账号,她提交的注册信息中的密码为”admin”,那么实际存到数据库中的密码为“21232F297A57A5A743894A0E4A801FC3”(假设采用MD5加密,并且不会被破解)。这样我们至少保证了只有小红本人能够通过其账号进行登录,因为密码只有她自己知道。

阅读更多

当我们从数据库得到一个对象的时候,我们通常有两种比较简单的方式,一种是通过session的get()方法,另一种是load()方法,但其实这两种是有区别的。写这篇文章的目的并不是为了通过Demo去给读者演示这两者到底是有什么区别,只是一篇总结性的文章。告诉自己需要记住Hibernate的这个点。

这两种在查询性能上是有一定区别的,但在项目中更倾向的肯定是load()方法。

PS,概念什么的就不详细介绍了,主要就是列举一下而已,因为我自己本身是对这个点比较了解了。

阅读更多

Hibernate中会经常用到set等集合来表示1-N的关系。比如,我有Customer和Order两个对象。其中,在Customer中有一个Order的set集合,表示在一个顾客可以拥有多个Order,而在Order对象中存在了一个Customer的对象,表示这个Order是哪个顾客下的单。这个算是比较典型的双向1-N关联。

这给我们带来了很大的好处,当我得到了Customer对象的时候,我们可以很方便的将与其相关联的Order集合查询出来,这也非常符合我们的实际业务,毕竟我们不可能给这个Cutomer对象别人的Order吧,这既不安全,而且对Customer的普通顾客来说,并无卵用。所以我们不得不说Hibernate的ORM做的很好,但凡事都有但是(要是没有但是,也就没有写这篇文章的必要了)。

我们再对数据库进行访问的时候必须要考虑性能问题(通俗点讲,就是用少发SQL语句),当我们设定了1-N这种关系后,查询过程中就有可能出现N+1问题。

关于N+1问题,并不是本文的重点。但关于N+1问题,我们需要知道的是,这个问题会导致SQL语句的增加,也就是要与数据库进行更多的交互,这无疑会给项目以及后台数据库带来影响。

阅读更多

本文是对JVM的经典学籍《深入理解Java虚拟机》中知识学习的总结摘抄,原书内容写的很好,所特意从中摘取自己觉得比较重要的点,不求能够全部掌握所有内容,但至少保证能够在整体轮廓上有所斩获。
关于JVM的学习一共包含三篇文章,本文是第三篇:
深入学习JVM1:自动内存管理机制
深入学习JVM2:自动内存管理机制
深入学习JVM3:虚拟机类加载机制

本文的内容是关于JVM如何加载Class文件以及Class文件中的信息进入到虚拟机后会发生什么变化。本文内容主要包括一下这个部分:

  • 类加载的时机
  • 类加载的过程
  • 类加载器

    阅读更多

本文是对JVM的经典学籍《深入理解Java虚拟机》中知识学习的总结摘抄,原书内容写的很好,所特意从中摘取自己觉得比较重要的点,不求能够全部掌握所有内容,但至少保证能够在整体轮廓上有所斩获。
关于JVM的学习一共包含三篇文章,本文是第二篇:
深入学习JVM1:自动内存管理机制
深入学习JVM2:自动内存管理机制
深入学习JVM3:虚拟机类加载机制

本文的内容是关于JVM的自动内存管理机制,其包含两部分内容:

  1. Java内存区域
  2. 对象访问
  3. 垃圾收集器与内存分配策略
  4. 通过例子讲解Java有了GC同样会可能出现内存泄露问题

    阅读更多