zoukankan      html  css  js  c++  java
  • 设计模式

    一、设计模式概述

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

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

  • 相关阅读:
    双链表
    单链表
    二叉树的遍历
    leetcode-9. 回文数
    leetcode-8. 字符串转换整数 (atoi)
    leetcode-7. 整数反转
    leetcode-6. Z 字形变换
    leetcode-5. 最长回文子串
    manacher-线性查找算法-(最长回文子串问题)
    bfprt-线性查找算法-(topK问题)
  • 原文地址:https://www.cnblogs.com/dormant-valcano/p/13666090.html
Copyright © 2011-2022 走看看