设计模式

 

一、设计模式概述

(一)设计模式的七大原则

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对象

posted @ 2020-09-14 13:12  休眠の火山  阅读(73)  评论(0编辑  收藏  举报