🌐 设计模式及源码分析(一)

一、设计模式总览

设计模式是一种思想,要理解思想,不要死记硬背

创建型模式(Creational Patterns)

  • 单例(Singleton)模式
  • 原型(Prototype)模式
  • 工厂方法(FactoryMethod)模式
  • 抽象工厂(AbstractFactory)模式
  • 建造者(Builder)模式

结构型模式(Structural Patterns)

  • 代理(Proxy)模式
  • 适配器(Adapter)模式
  • 桥接(Bridge)模式
  • 装饰(Decorator)模式
  • 外观(Facade)模式
  • 享元(Flyweight)模式
  • 组合(Composite)模式
  • 过滤器模式(Filter Pattern)

行为型模式(Behavioral Patterns)

  • 模板方法(Template Method)模式
  • 策略(Strategy)模式
  • 命令(Command)模式
  • 职责链(Chain of Responsibility)模式
  • 状态(State)模式
  • 观察者(Observer)模式
  • 中介者(Mediator)模式
  • 迭代器(Iterator)模式
  • 访问者(Visitor)模式
  • 备忘录(Memento)模式
  • 解释器(Interpreter)模式

二、设计的7大原则

①开闭原则(Open Closed Principle,OCP)

如果存在在一个系统A,要对系统A的实现类A1进行增强,我们应该重新创建一个实现类B1进行增强,而不是去修改A1类 (扩展新类而不是修改原类)

②里氏替换原则(Liskov Substitution Principle,LSP)

父类的自身方法不能修改,子类只能去修改父类提供的扩展方法 (继续父类而不是去改变父类)

相当于继承父类的遗产,而不是让父类去干什么干什么,去改变父类

③依赖倒置原则(Dependence Inversion Principle,DIP)

就像Controller 注入 Serivece ,Service 注入Dao ,而具体的实现由Dao的xml或者Service中的Impl去实现, (面相接口编程而不是面向实现类 )

④单一职责原则(Single Responsibility Principle,SRP)

每个类只负责自己管理的事情就行了,每个类应该为细粒度类,把功能不断进行划分,当然单一职责不代表就是在一个类中只有一个方法

⑤接口隔离原则(Interface Segregation Principle,ISP)

各类类建立自己的专用接口,而不是建立万能的接口

⑤迪米特法则(Law of Demeter,LoD)

假如有系统中有A、B、C、D...很多类,A如果要去调用、B、C、D,不能把B、C、D直接写入A类中,这是最多知道了,就比如一个国家负责人要知道人民的生活情况,可以建立一个社保部门,然后去问社保部门的负责人去了解,而不是去从每一个人中去了解。当然,如果过度的设计迪米特法则,就是产生过多的中间者 (无需直接交互的两个类,如果需要交互,使用中间者)

⑥合成复用原则(Composite Reuse Principle,CRP)

  • 我们应该把相同功能的方法组合起来进行使用,而不是继承进行使用 (优先组合,其次继承)

  • 所谓组合,就是把要引用的对象放在我的类中当成属性,然后根据属性进行方法调用,而不是直接继承

  • 所谓继承,就是直接继承对象,然后继承对象的方法 (组合:我有对方,继承:对方是我父)

三、创建型模式的作用

见名知意,创建型模式就是想考如何把对象创建出来,这种模式只关注对象如何创建,而不在意对象如何使用,因此,把对象的创建和使用分离,这样就可以减低了系统的耦合度,体现了高内聚低耦合中的低耦合,这种模式设计之后就可以让调用者不再关注对象的创建的细节

在这种模式中,我们可以让工厂类帮我们创建对象 (各种工厂模式)

也可以让建造者帮我们创建对象,类似与工人一步一步把我们需要的房子建造出来,(建造者模式)

也可以由原来的对象通过克隆出一个一样的对象供我们使用,就比如条件允许的话,我们可以通过克隆爱因斯坦出来,而不是通过等待一个像爱因斯坦一样聪明的人,克隆的效率更高 (原型模式)

我们在系统中有很多相同的一个类,但我们需要这个类是一样的 (单例模式)

3.1 单例(Singleton)模式

在单例模式下一个类只能有一个实例,该实例可以通过一个全局访问点来访问。单例模式通常用于控制对唯一实例的访问,并且可以节省系统资源,避免多次创建实例。常见的单例模式包括懒汉式单例、饿汉式单例和双重检查锁单例等。通过单例模式,可以确保一个类在任何情况下只有一个实例存在。

单例的的代码实现逻辑有

  • 构造器私有可以实现这个类只能是只有一个实例
  • 必须实现自行创建实例的方法
  • 自己去实现对外提供的实例化方法

代码实现

1.建立Earth

Java 复制代码
public class Earth {

    private String earthNameAge;

    //懒汉
    private volatile static Earth instance;

    //构造器私有,外部不能实例化
    private Earth() {
        System.out.println("make Earth");
    }

    //提供给外部的方法
    //1、双重检查锁+内存可见性(设计模式)
    public static Earth getEarth() {
        //如果没有再去创建
        if (instance == null) {
            synchronized (Earth.class) {
                if (instance == null) {
                    //多线程问题
                    instance = new Earth();
                }
            }
        }
        return instance;
    }

}

2.建立MainTest方法测试

java 复制代码
public class MainTest {

    public static void main(String[] args) {
        Earth earth1 = Earth.getEarth();

        Earth earth2 = Earth.getEarth();

        System.out.println(earth1 == earth2);

    }
}
相关推荐
小刘|3 分钟前
《Java 实现希尔排序:原理剖析与代码详解》
java·算法·排序算法
逊嘘22 分钟前
【Java语言】抽象类与接口
java·开发语言·jvm
金池尽干25 分钟前
设计模式之——观察者模式
观察者模式·设计模式
morris13129 分钟前
【SpringBoot】Xss的常见攻击方式与防御手段
java·spring boot·xss·csp
也无晴也无风雨38 分钟前
代码中的设计模式-策略模式
设计模式·bash·策略模式
monkey_meng1 小时前
【Rust中的迭代器】
开发语言·后端·rust
余衫马1 小时前
Rust-Trait 特征编程
开发语言·后端·rust
monkey_meng1 小时前
【Rust中多线程同步机制】
开发语言·redis·后端·rust
七星静香1 小时前
laravel chunkById 分块查询 使用时的问题
java·前端·laravel
Jacob程序员1 小时前
java导出word文件(手绘)
java·开发语言·word