设计模式分为
- 创建型 工厂模式 单例 原型
- 行为性 责任链 迭代器 命令
- 中介型
- 结构性 适配器 代理 门面 装饰器 组合 桥接
单例设计模式
懒汉式 用到时再创建,省内存
饿汉式 类创建时就创建,会占用内存
内部类 用到时再创建,省内存
线程池、数据库连接池常用
懒汉式
volatile禁止指令重排
package com.fang.order.controller; public class Singleton { private volatile static Singleton instance; private Singleton() { } public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } }
饿汉式 利用jvm类加载机制
public class Singleton { private static final Singleton instance = new Singleton(); private Singleton() { } public static Singleton getInstance() { return instance; } }
内部类
public class Singleton { private static class InnerSingleton { private static Singleton INSTANCE = new Singleton(); } private Singleton() { } public static Singleton getInstance() { return InnerSingleton.INSTANCE; } }
工厂方法模式
简单工厂、工厂方法、抽象工厂
简单工厂
在不暴露生成逻辑的前提下生成一个实例 DoorFactory 根据输入的参数来返回不同的实现类。
工厂方法
概念:把生产逻辑移交给子类。
抽象出一个工厂抽象类,抽象类完成共有的方法,然后每个具体实现类去实现个性化生成部分。
![]()
抽象工厂
只有一个产品时是工厂方法;多个产品时就是抽象工厂 比如下图DoorFactory同时生产DoorExpert和Door两个产品。
模板方法模式
按照一定步骤解决问题时常用
抽象类定义一个共有方法templateMethod,此方法内部调用templateMethod0、templateMethod1。templateMethod0、templateMethod1方法由子类具体实现
此模式应用在HttpServlet、AbstractController等类中
![]()
责任链模式
每一步做特定的任务,传给下一步。
优点:扩展性好,耦合性低 劣势:链太长,性能损耗大
代理模式
静态代理 代码层面编写,被代理类作为代理类的成员变量,代理类在调用被代理类的方法前后最某些增强。
动态代理 运行时代理。jdk的Class类和cglib实现。
- jdk :自定义类继承InvocationHandler类,实现invoke方法。构造方法传入被代理类。
(1)jdk方式调用