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

一、设计模式总览

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

创建型模式(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);

    }
}
相关推荐
方圆想当图灵15 分钟前
缓存之美:万文详解 Caffeine 实现原理(下)
java·redis·缓存
栗豆包30 分钟前
w175基于springboot的图书管理系统的设计与实现
java·spring boot·后端·spring·tomcat
等一场春雨1 小时前
Java设计模式 十四 行为型模式 (Behavioral Patterns)
java·开发语言·设计模式
萧若岚1 小时前
Elixir语言的Web开发
开发语言·后端·golang
Channing Lewis2 小时前
flask实现重启后需要重新输入用户名而避免浏览器使用之前已经记录的用户名
后端·python·flask
Channing Lewis2 小时前
如何在 Flask 中实现用户认证?
后端·python·flask
酱学编程2 小时前
java中的单元测试的使用以及原理
java·单元测试·log4j
我的运维人生2 小时前
Java并发编程深度解析:从理论到实践
java·开发语言·python·运维开发·技术共享
一只爱吃“兔子”的“胡萝卜”2 小时前
2.Spring-AOP
java·后端·spring
HappyAcmen2 小时前
Java中List集合的面试试题及答案解析
java·面试·list