一、设计模式概述
(一)设计模式的七大原则
1)单一职责原则
2)接口隔离原则
3)依赖倒转原则
面向接口编程
4)里氏替换原则
5)开闭原则
对扩展开放(对提供方),对修改关闭(对使用方)
6)迪米特法则
最小知道原则
核心是降低类之间的耦合
7)合成复用原则
尽量使用合成/聚合的方式而不是继承
(二)UML类图
(三)设计模式类型
分为三种类型,共23种
1.创建型模式:站在类的角度
单例模式、简单工厂模式(静态工厂模式)、原型模式、建造者模式、工厂模式;
2.结构型模式:站在代码结构角度
适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式;
3.行为模式:站在方法角度
模板方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter模式)、状态模式、策略模式、职责链模式(责任链模式)
二、设计模式详述
设计模式+源码解读 https://blog.csdn.net/q975583865/category_7798009.html
(一)单例模式
1.介绍
1)介绍
所谓单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)。
2)8种类型
饿汉式(静态常量)、饿汉式(静态代码块)、懒汉式(线程不安全)、懒汉式(线程安全,同步方法)、懒汉式(线程安全,同步代码块)、双重检查、静态内部类、枚举
3)使用场景
需要频繁进行创建和销毁的对象、创建对象时耗时过多或耗费资源过多(即:重量级对象),但又经常用到的对象、工具类对象、频繁访问数据或文件的对象(比如数据源、session工厂等)
2.分类
1.1饿汉式(静态常量)
a.代码
public class HungryStatic {
//1.私有构造
private HungryStatic() {
}
//2.new私有实例
private static final HungryStatic instance = new HungryStatic();
//3.getInstance
public static HungryStatic getInstance() {
return instance;
}
}
1.2饿汉式(静态代码块)
a.代码
public class HungryStatic1 {
private HungryStatic1(){};
private static final HungryStatic1 instance;
static {
instance = new HungryStatic1();
}
public static HungryStatic1 getInstance(){
return instance;
}
}
1.3懒汉式(线程不安全)
a.代码
public class Lazy {
private Lazy(){};
private static Lazy instance;
public static Lazy getInstance(){
if(instance == null){
instance = new Lazy();
}
return instance;
}
}
1.4懒汉式(线程安全)
a.代码
public class Lazy1 {
private Lazy1(){}
private static volatile Lazy1 instance;
public static synchronized Lazy1 getInstance(){
if(instance != null){
instance = new Lazy1();
}
return instance;
}
}
1.5懒汉式(线程安全方法)
a.代码
public class Lazy2 {
private Lazy2() {
}
private static volatile Lazy2 instance;
public static Lazy2 getInstance(){
if(instance == null){
synchronized (Lazy2.class){
instance = new Lazy2();
}
}
return instance;
}
}
1.6双重检查
a.代码
public class DoubleCheck {
private DoubleCheck(){
}
private static volatile DoubleCheck instance;
public static DoubleCheck getInstance(){
if(instance == null){
synchronized (DoubleCheck.class){
if(instance == null){
instance = new DoubleCheck();
}
}
}
return instance;
}
}
1.7静态内部类
a.代码
public class Innerclass {
private Innerclass(){}
private static class Innerclass1{
private static Innerclass instance = new Innerclass();
}
public static synchronized Innerclass getInstance(){
return Innerclass1.instance;
}
}
b.notes
线程安全
原因:类只初始化一次
懒汉式
原因: 使用时才初始化
类的生命周期
加载-连接(验证,准备,解析)-初始化-使用-卸载
加载:加载到内存中,生成字节码文件。
验证:验证flag,数据范围等。
准备:静态变量赋初值等。
解析:把类中的符号转变为直接引用。
初始化:init每个类初始化一次。
1.8枚举
a.代码
public enum Singleton {
INSTANCE;
Singleton() {
}
}
推荐
(二)工厂模式
意义:将实例化对象的代码提取出来,放到一个类统一管理和维护,。
三种:
简单工厂模式(静态工厂模式)、
工厂方法模式、
抽象工厂模式
原则:设计模式的依赖抽象原则
使用:jdk-calender
根据不同情况,new 不同实例
(三)原型模式
(四)建造者模式
1.外观模式(门面模式)
facade
使用:Mybatis中Configuration 去创建MetaObject对象