23种设计模式_学习笔记

一. 面向对象的七大原则

开闭原则: 对扩展开放,对修改关闭
里氏替换原则: 继承必须确保超类所拥有的性质在子类中仍然成立
依赖倒置原则: 要面向接口编程, 不要面向实现编程;
单一职责原则: 控制 类的粒度大小、将对象解耦,提高其内聚性;
接口隔离原则: 要为各个类建立它们需要的专用接口
迪米特法则: 只与你的朋友交谈,不跟"陌生人"说话;
合成复用原则: 尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现;

二.设计模式的分类

  1. 创建型模式: 描述怎么去创建一个对象;它的特点是对象的创建和使用分离
    单例、工厂、抽象工厂、建造者、原型模式
    理解:帮助程序员省去new对象的过程
  2. 结构型模式 : 描述将类或者对象按照某种布局组成更大的结构 ; 作用: 从程序的结构上实现松耦合,从而可以扩大整体的类结构,用来解决更大的问题;
    适配器、桥接、装饰、组合、外观、享元、代理模式
  3. 行为性模式: 描述类或者对象之间怎么能够相互协作,去共同完成单个对象无法完成的任务,主要是分配职责
    模板方法模式、命令模式、迭代器、观察者模式、中介者模式、备忘录模式、解码器模式、状态模式、策略模式、职责链模式、访问者模式;

1. 单例模式

最重要的思想,构造器私有化(别人无法new这个对象,保证内存中只有一个对象)

1.1 饿汉式单例

一开始就new对象;
缺点:可能会造成资源浪费;

public class Hungry {
    
    
    private byte[] data= new byte[1024*1024];
    private byte[] dat2= new byte[1024*1024];
    private byte[] dat3= new byte[1024*1024];
    private Hungry() {
    
    

    }

    private final static Hungry HUNGRY = new Hungry();
    public static Hungry getInstance(){
    
    
        return HUNGRY;
    }
}

1.2 懒汉式单例

public class LazyMan {
    
    
    private LazyMan(){
    
    

    }
    private volatile static LazyMan lazyMan;
    public static LazyMan getInstance(){
    
    
        if(lazyMan==null){
    
    
            synchronized (LazyMan.class){
    
    
                if(lazyMan==null){
    
    
                    //这里不是原子性操作 
                    /*1.分配内存空间;2.执行构造方法,初始化对象;3把这个对象指向这个空间*/
                    lazyMan=new LazyMan();   
                }
            }
        }
        return  lazyMan;
    }
}

1.3 静态内部类形式的单例

public class Holder {
    
    
    private Holder(){
    
    

    }
    public static Holder getInstance(){
    
    
        return InnerClass.HOLDER;
    }
    public static class InnerClass{
    
    
        private static final Holder HOLDER = new Holder();
    }
}

单例不安全,(反射会破坏)

1.4 枚举类型的单例(安全)

public enum EnumSingle {
    
    
    INSTANCE;
    public EnumSingle getInstance(){
    
    
        return INSTANCE;
    }
}

2. 工厂模式

作用: 创建者和调用者分离
核心本质:

  • 实例化对象不适用new,用工厂方法代替
  • 将选择实现类,创建对象统一管理和控制。从而将调用者跟我们的实现类解耦;

分类:

  • 简单工厂模式(静态工厂)
    用来生产同一等级结构中的任意产品(增加新产品需要修改已有代码)

    1.工厂类里静态方法负责new对象,消费者只需调用静态工厂里的相应方法即可

  • 工厂方法模式
    不修改已有类的前提下,通过增加新的工厂类实现扩展;
    工厂方法模式中,每个被建造的类型都会有一个对应的工厂,工厂负责new对象;
    每次创建对象时,需要new相应类型的工厂,再调用工厂中负责new对象的方法;

    工厂方法模式中,规定统一的工厂接口以及对象的接口,要被创建的对象都是有相应的工厂(里的方法)帮我们创建,
    我们需要手动创建该类型的工厂,调用工厂里面的方法;

  • 抽象工厂模式
    不可以增加产品,可以增加产品族;
    定义: 抽象工厂模式提供了一个创建一系列相关或者相互依赖对象的接口,无需指定它们具体的类;

3.建造者模式

  • 定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
  • 主要作用: 在用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象;
  • 用户只需要给出指定复杂对象的类型和内容,建造者模式负责按顺序创建复杂对象(把内部的建造过程和细节隐藏起来)

4.原型模式

5.适配器模式

  • 作用:

猜你喜欢

转载自blog.csdn.net/qq_40084325/article/details/113618489