一、设计模式的原则(设计模式的依据)
1.1、单一职责原则:
对类来说,一个类只负责一项职责。降低类的复杂度,提高类的可读性,可维护性,降低变更引起的风险。
1.2、接口隔离原则:Interface Segregation Principle
客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小的接口上。
多个类实现同一个接口,可能会出现接口中所有的方法不都是每一个类都需要的,但是却必
须实现。所以,拆接口,拆成多个小的接口。实现接口隔离。
1.3、依赖倒置原则:Dependence Inversion Principle
高层模块不应该依赖底层模块,二者都应该依赖其抽象。抽象不该依赖细节,细节应该依赖抽象。依赖倒置中
心思想是面向接口编程。相对于细节的多变性,抽象东西要稳定的多。以抽象为基础搭建成来的架构要比以细
节为基础搭建的架构稳定的多。在Java中抽象指的就是接口或者抽象类,细节就是实现类。
方式一:通过接口传递依赖
方式二:通过构造方法传递依赖
方式三:通过setter方法传递依赖
1.4、里氏替换原则
针对继承而言,所有引用基类的地方必须能透明的使用其子类的方法。子类中尽量不要重写父类的方法。
继承实际增强了两个类的耦合性,在适当的情况下,可以通过聚合,组合,依赖来解决该问题。
1.5、开闭原则(Important)
重要。一个软件实体如类,模块和函数应该对扩展开放,对修改关闭。用抽象构建框架,用实现扩展细节。
当软件需要变化时,尽量通过扩展软件实体来实现变化,而不是通过修改已有的代码来实现变化。编程中
遵循其他原则,以及使用设计模式的目的就是遵循开闭原则。
1.6、迪米特法则(最少知道原则)
一个对象应该对其他对象保持最少的了解。类和类关系越密切,耦合度越大。一个类对自己依赖的类知道的
越少越好,对于被以来的类无论多么复杂,都尽量将逻辑封装在类的内部,对外除了提供public方法,不对外
泄露任何信息。只与直接耦合的对象进行通信。耦合关系有依赖,关联,组合,聚合等。出现在成员变量,方
法参数,方法返回值中的类为直接耦合。
细节:降低依赖关系,而不是完全没有依赖关系是不可能的。
1.7、合成复用原则
原则是尽量使用合成、聚合的方式,尽量减少继承的使用。
二、UML类图
2.1、用于描述系统中(对象)本身的组成和类(对象)之间的各种静态关系。类之间的关系:依赖,
泛化(继承),实现,关联,聚合,组合。
解释:
车的类图结构为<<abstract>>,表示车是一个抽象类;
它有两个继承类:小汽车和自行车;它们之间的关系为实现关系,使用带空心箭头的虚线表示;
小汽车为与SUV之间也是继承关系,它们之间的关系为泛化关系,使用带空心箭头的实线表示;
小汽车与发动机之间是组合关系,使用带实心箭头的实线表示;
学生与班级之间是聚合关系,使用带空心箭头的实线表示;
学生与身份证之间为关联关系,使用一根实线表示;
学生上学需要用到自行车,与自行车是一种依赖关系,使用带箭头的虚线表示;
三、设计模式正篇
3.1、创建型模式
3.1.1 单例模式
(1)饿汉式---静态常量/静态代码块,线程安全
步骤:构造器私有化,在类的内部创建对象,向外暴露一个静态公共方法。
优点:写法简单,在类装在的时候就完成实例化。避免线程同步问题。
缺点:没有达到懒加载,可能造成内存浪费。
结论:线程安全,可能造成内存浪费。
(2)懒汉式---线程不安全
步骤:调用方法时才去创建。首先判断是否有实例,然后返回对象。
结论:线程不安全,不可用。
(3)同步方法---线程安全(懒汉式一种),
步骤:在方法上加锁,synchronized。
结论:线程安全,可用,但是效率低,不推荐使用。
(4)同步代码块---线程不安全(懒汉式一种),
步骤:在null判断中对对象添加synchronized。
结论:线程不安全,不可用。
(5)双重检查(推荐):线程安全
步骤:volatile修饰对象,使变化可见,先判断是否为空,然后锁对象class,再判断是否为空,
再创建对象。
结论:线程安全,解决了上面的问题。推荐使用。
(6)静态内部类(推荐):线程安全
步骤:构造器私有化,类中添加一个静态内部类,类中有一个静态属性并已经初始化的单例外部类对
象。外部类对外提供获取方法。
结论:外部类装载的时候,内部静态类不会装载。在调用getInstance()时,才装载这个类,且只加载
一次,实现懒加载。JVM在加载类的时候是线程安全的。
(7)枚举:(推荐):线程安全
步骤:
enum Singleton { INSTANCE;}
结论:线程安全,但不可反射获取。
使用场景:
需要频繁创建和销毁对象,创建对象时耗时过多或耗费资源过多,但又经常用到的对象,工具类对象,
频繁访问数据库或文件的对象(比如数据源,session工厂等)。
JDK中Runtime类用到的是饿汉式静态常量方式。
3.1.2 工厂模式