Night Field's Blog

Make it work, make it right, make it fast.

结构模式之外观模式

1 概述 外观模式(Facade Pattern),也叫门面模式,是一种常见结构模式,它是面向对象设计封装思想的体现。 2 外观模式 所谓外观,其实是一个额外的类,它包含了复杂多变的子系统,并只对外提供简单的接口。相比于子系统,外观类提供的功能有限,因为它只包含外界真正关心的功能。 比如汽车只提供「方向盘」,「油门」,「刹车」几个简单元件供人使用,我们并不关心,也不需要关心发动机,刹车...

创建型模式之单例模式

1 概述 单例模式(Singleton Pattern)应该是最简单,同时又是最复杂的一种创建型模式。因为大家都知道这个模式:无非就是保证某个对象在系统中只存在一个实例。然而想要真正实现一个完美的单例模式,却不简单。 2 单例模式 一般单例模式的实现,都需要包含两个步骤: 将类的构造函数私有化。 提供一个public的方法,以供外界获取唯一的实例。 下面将一一介绍单例模式...

创建型模式之原型模式

1 概述 原型模式(Prototype Pattern)比较好理解,即以某个对象为原型,创建该对象的副本。我们可以不用知道对象内部的属性以及内部的状态,是迪米特法则的很好体现。 2 原型模式 原型模式一般用在较为复杂对象的创建,并且希望保留对象所持有的状态。Java对这种对象的创建方式也是提供了原生的支持——Object.clone()方法。 1 2 3 public class Ob...

创建型模式之建造者模式

1 概述 前面我们说了工厂模式和抽象工厂模式,下面来说说建造者模式(Builder Pattern)。 建造者模式也是一种极为常见的创建型模式,前面提到的两类工厂模式隐藏了类的属性与构造细节,而建造者模式通过Builder类,适当地暴露了类的属性,使得类的创建更具有灵活性和可读性。 2 建造者模式 当一个类的构造函数包含很多参数,或者参数之间有很多种组合(如肯德基的套餐),调用构造函数...

创建型模式之抽象工厂模式

1 概述 上一篇文章讲到了工厂方法模式,它提供了一种在不指定具体实现的情况下,创建类实例的解决方案。那为什么还需要抽象工厂模式(Abstract Factory Pattern)呢? 2 抽象工厂模式 抽象工厂模式本质上,也是定义一个工厂,用来作为类创建的入口,拥有工厂方法模式的优点:如隐藏类的构造细节,降低类的使用复杂度,与调用者解耦等等。 而它与工厂方法模式最大的区别在于,抽象工厂...

创建型模式之工厂模式

1 概述 创建型模式,提供了一种创建对象的最佳实践。工厂方法模式(Factory Method Pattern)的核心思想,是通过统一的工厂类来获取对象,而不需要调用类的构造方法。 2 优点 可以将类的实例化过程延缓到子类。调用者无需知道接口/抽象类的具体实现是什么,利用工厂方法即可获取类的实例,降低与调用者的耦合度。 隐藏类的构造细节,降低类创建的复杂度,提高程序可读性。 ...

设计模式之六大原则

1 概述 在面向对象的编程中,要实现一个功能,可以有非常多的方式。在多年的经验积累总结下来,人们发现优秀的的代码总是遵循一定的范式。其中23种设计模式(Design Patterns),就是前人对优秀代码的编程范式的总结,是面向对象编程的最佳实践。合理地运用这些设计模式,已经是写出高质量,高效率,可读性强,易维护的代码的充要条件。 而设计模式的六大原则,则是设计模式都会遵守的通用法则。本文...

SpringBoot服务无法读取系统变量,我重新认识了profile和bashrc

背景 CentOS服务器上,我们用Systemd部署了一个SpringBoot服务。关于如何部署,可以参考这篇文章。这个SpringBoot服务会用ProcessBuilder去调用机器上一个C++的可执行文件。 问题描述 SpringBoot程序跑得很正常,但是我们发现C++程序却没有log输出,也就是说它从没被执行过。 查看了ProcessBuilder的返回值,是127。127的...

SpringBoot以服务形式启动,并设置JVM启动参数

1 概述 SpringBoot使得我们可以快速地上手以及开发Spring项目。我们可以把工程打成一个jar包,然后部署到服务器上(这里只讨论Linux,因为没多少人会拿Windows当服务器)。nohup命令可以让程序作为后台进程执行,但是它不好管理维护,也显得很不专业。更好的方法是将SpringBoot作为Service启动。 2 步骤 2.1 Maven打包 通过package命...

用Java递归设置文件的用户,组和权限

前言 自从1.7版本开始,Java引入了Nio包,提供了更强大的IO功能。 本文简单介绍如何用java.nio.file.attribute下的工具类修改文件的权限,用户和组。因为本类库是针对Posix类系统的的,所以主要适用于Linux和Mac上(实测Win7不支持)。 测试样例 测试代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1...