一篇文章读懂六大设计模式

绝地灬酷狼 2023-10-05 10:02 108阅读 0赞

文章目录

    • 一、单例模式
        • 1、简介
        • 2、目的
        • 3、结构图解
        • 4、特点
        • 5、代码
        • 6、适用场景
    • 二、工厂模式
        • 1、简介
        • 2、目的
        • 3、结构图解
        • 4、特点
        • 5、代码
    • 三、装饰者模式
        • 1、简介
        • 2、目的
        • 3、结构图解
        • 4、特点
        • 5、代码
        • 6、使用场景
    • 四、代理模式
        • 1、简介
        • 2、目的
        • 3、结构图解
        • 4、特点
        • 5、代码
    • 五、观察者模式
        • 1、简介
        • 2、目的
        • 3、结构图解
        • 4、特点
        • 5、代码
    • 六、策略模式
        • 1、简介
        • 2、目的
        • 3、结构图解
        • 4、特点
        • 5、代码
    • 七、Xmind整理

一、单例模式

1、简介

韦小宝有7个老婆,但是每个都只有他这一个老公,他的所有老婆叫老公时,指的都是他,他就是一个单例。

2、目的

为了确保一个类有且仅有一个实例,并为它提供一个全局访问点。

3、结构图解

在这里插入图片描述

4、特点

  • 单例模式保证了类仅有一个实例,并为其提供了一个全局访问点。通过延迟初始化(仅在第一次使用它时才初始化),一个单例对象是达到此目的的通用做法。
  • 在多线程环境下,必须小心管理线程间的协作,因为它们访问单例对象方法与数据的时间,可能只有毫厘之差。
  • 对象具有唯一性,并不意味着使用了单例模式。单例模式通过隐藏构造函数,提供对象创建的唯一入口点。
  • 单例模式初始化时创建对象。
  • 只对外提供公共的getInstance方法,不提供任何公共构造函数。

5、代码

  1. public class Singleton {
  2. //保证 instance 在所有线程中同步
  3. private static volatile Singleton instance = null;
  4. private Singleton() {
  5. } //private 避免类在外部被实例化
  6. public static synchronized Singleton getInstance() {
  7. //getInstance 方法前加同步
  8. if (instance == null) {
  9. instance = new Singleton();
  10. }
  11. return instance;
  12. }
  13. }

6、适用场景

适合需要做全局统一控制的场景,例如:全局唯一的编码生成器。

二、工厂模式

1、简介

小明追妹子的时候,请她喝了不少咖啡,她爱喝卡布奇诺,每次去咖啡店,只要跟服务员说“来杯卡布奇诺”就行了,虽然各家的口味有些不同,但是不管是星爸爸还是Costa,都能够提供卡布奇诺这种咖啡。这里的星爸爸和Costa就是生产咖啡的工厂。

2、目的

直接从工厂类中获取各种产品,不在需要亲自去挑选产品。

3、结构图解

在这里插入图片描述

4、特点

  • 客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。

5、代码

用户

  1. public class FactoryPattern {
  2. public static void main(String[] args) {
  3. // 1、创建工程类
  4. Factory factory = new ConcreteFactoryA();
  5. // 2、生产产品
  6. Product product = factory.createProduct();
  7. // 3、消费产品
  8. product.use();
  9. }
  10. }

产品力

  1. //实体类产品
  2. interface Product {
  3. public void use();
  4. }
  5. //具体产品A:实现抽象产品中的抽象方法
  6. class ConcreteProductA implements Product {
  7. public void use() {
  8. System.out.println("具体产品A显示...");
  9. }
  10. }

工厂类

  1. //抽象工厂:提供了厂品的生成方法
  2. interface Factory {
  3. public Product createProduct();
  4. }
  5. //具体工厂A:实现了厂品的生成方法
  6. class ConcreteFactoryA implements Factory {
  7. @Override
  8. public Product createProduct() {
  9. System.out.println("具体工厂A生成-->具体产品A.");
  10. return new ConcreteProductA();
  11. }
  12. }

三、装饰者模式

1、简介

大学毕业,想要送给室友一个有纪念意义的礼物,就找到一张大家的合照,在上面写上“永远的兄弟!”,然后拿去礼品店装了个相框,再包上礼盒。这里的我和礼品店都是装饰器,都没有改变照片本身,却都让照片变得更适合作为礼物送人。

2、目的

在不改变原有功能的基础下,对功能进行扩展。

3、结构图解

在这里插入图片描述

4、特点

  • 使用不同的装饰器组合为对象扩展N个新功能,而不会影响到对象本身。

5、代码

用户

  1. public class DecoratorPattern {
  2. public static void main(String[] args) {
  3. Component component = new ConcreteComponent();
  4. component.operation();
  5. System.out.println("---------------------------------");
  6. ConcreteDecorator decorator = new ConcreteDecorator(component);
  7. decorator.operation();
  8. }
  9. }

构建角色

  1. //抽象构件角色
  2. interface Component {
  3. public void operation();
  4. }
  5. //具体构件角色
  6. class ConcreteComponent implements Component {
  7. public ConcreteComponent() {
  8. System.out.println("创建具体构件角色");
  9. }
  10. public void operation() {
  11. System.out.println("调用具体构件角色的方法operation()");
  12. }
  13. }

装饰角色

  1. class ConcreteDecorator {
  2. private Component component;
  3. public ConcreteDecorator(Component component) {
  4. this.component = component;
  5. }
  6. public void operation() {
  7. component.operation();
  8. System.out.println("为具体构件角色增加额外的功能addBehavior()");
  9. }
  10. }

6、使用场景

  • 适合需要(通过配置,如:diamond)来动态增减对象功能的场景。
  • 适合一个对象需要N种功能排列组合的场景(如果用继承,会使子类数量爆炸式增长)

四、代理模式

1、简介

淘宝店客服总是会收到非常多的重复问题,例如:有没有现货?什么时候发货?发什么快递?大量回答重复性的问题太烦了,于是就出现了小蜜机器人,他来帮客服回答那些已知的问题,当碰到小蜜无法解答的问题时,才会转到人工客服。这里的小蜜机器人就是客服的代理。

2、目的

代理用户的请求,去完整后续的各项任务。

3、结构图解

在这里插入图片描述

4、特点

  • 代理可以协调调用方与被调用方,降低了系统的耦合度。根据代理类型和场景的不同,可以起到控制安全性、减小系统开销等作用。

5、代码

用户

  1. public class ProxyPattern {
  2. public static void main(String[] args) {
  3. // 获取代理对象
  4. Proxy proxy = new Proxy();
  5. // 执行方法
  6. proxy.request();
  7. }
  8. }

真实主题

  1. //真实主题
  2. class RealSubject {
  3. // 2、真实方法
  4. public void request() {
  5. System.out.println("访问真实主题方法...");
  6. }
  7. }

代理类

  1. //代理
  2. class Proxy {
  3. private RealSubject realSubject;
  4. public void request() {
  5. realSubject = new RealSubject();
  6. // 1、之前方法
  7. preRequest();
  8. // 2、真实方法
  9. realSubject.request();
  10. // 3、之后方法
  11. afterRequest();
  12. }
  13. // 1、之前方法
  14. public void preRequest() {
  15. System.out.println("访问真实主题之前的预处理。");
  16. }
  17. // 3、之后方法
  18. public void afterRequest() {
  19. System.out.println("访问真实主题之后的后续处理。");
  20. }
  21. }

五、观察者模式

1、简介

出差在外,想了解孩子在家的情况,这时候只要加入“相亲相爱一家人”群,老爸老妈会经常把孩子的照片和视频发到群里,你要做的就是作为一个观察者,刷一刷群里的信息就能够了解一切了。

2、目的

适用于一对多的的业务场景,一个对象发生变更,会触发N个对象做相应处理的场景。

3、结构图解

在这里插入图片描述

4、特点

  • 将复杂的串行处理逻辑变为单元化的独立处理逻辑,被观察者只是按照自己的逻辑发出消息,不用关心谁来消费消息,每个观察者只处理自己关心的内容。逻辑相互隔离带来简单清爽的代码结构。

5、代码

用户

  1. public class ObserverPattern {
  2. public static void main(String[] args) {
  3. // 1、创建目标对象
  4. ConcreteSubject subject = new ConcreteSubject();
  5. // 2、创建具体观察者A、B
  6. Observer obsA = new ConcreteObserverA();
  7. Observer obsb = new ConcreteObserverB();
  8. // 3、将具体观察者加入到目标对象中
  9. subject.add(obsA);
  10. subject.add(obsb);
  11. // 4、调用A、B查看
  12. subject.notifoy();
  13. }
  14. }

具体目标

  1. //具体目标
  2. class ConcreteSubject {
  3. protected List<Observer> observers = new ArrayList<Observer>();
  4. //增加观察者方法
  5. public void add(Observer observer) {
  6. observers.add(observer);
  7. }
  8. // 调用观察者执行
  9. public void notifoy() {
  10. System.out.println("具体目标状态发生改变...");
  11. System.out.println("--------------");
  12. for (Observer obs : observers) {
  13. obs.process();
  14. }
  15. }
  16. }

观察者A、B

  1. //抽象观察者
  2. interface Observer {
  3. void process(); //具体的处理
  4. }
  5. //具体观察者A
  6. class ConcreteObserverA implements Observer {
  7. public void process() {
  8. System.out.println("具体观察者A处理!");
  9. }
  10. }
  11. //具体观察者B
  12. class ConcreteObserverB implements Observer {
  13. public void process() {
  14. System.out.println("具体观察者B处理!");
  15. }
  16. }

六、策略模式

1、简介

男生追妹子时,一般都会用到这种模式,常见的策略有这些:约会吃饭;看电影;看演唱会;逛街;去旅行……,虽然做的事情不同,但可以相互替换,唯一的目标都是捕获妹子的芳心。

2、目的

为同一的内容,选择不同的解决方案。

3、结构图解

在这里插入图片描述

4、特点

  • 策略模式提供了对“开闭原则”的完美支持,用户可以在不修改原有系统的基础上选择算法或行为。干掉复杂难看的if-else。

5、代码

用户

  1. public class StrategyPattern {
  2. public static void main(String[] args) {
  3. // 1、创建环境类对象
  4. Context context = new Context();
  5. // 2.1、创建策略类A对象
  6. Strategy strategyA = new ConcreteStrategyA();
  7. // 3.1、将策略A添加到环境类中
  8. context.setStrategy(strategyA);
  9. // 4.1、执行策略A方法
  10. context.algorithm();
  11. System.out.println("-----------------");
  12. // 2.1、创建策略类B对象
  13. Strategy strategyB = new ConcreteStrategyB();
  14. // 3.1、将策略B添加到环境类中
  15. context.setStrategy(strategyB);
  16. // 4.1、执行策略B方法
  17. context.algorithm();
  18. }
  19. }

策略类

  1. //抽象策略类
  2. interface Strategy {
  3. public void algorithm(); //策略方法
  4. }
  5. //具体策略类A
  6. class ConcreteStrategyA implements Strategy {
  7. public void algorithm() {
  8. System.out.println("具体策略A的策略方法被访问!");
  9. }
  10. }
  11. //具体策略类B
  12. class ConcreteStrategyB implements Strategy {
  13. public void algorithm() {
  14. System.out.println("具体策略B的策略方法被访问!");
  15. }
  16. }

待解决问题

  1. //环境类
  2. class Context {
  3. private Strategy strategy;
  4. public void setStrategy(Strategy strategy) {
  5. this.strategy = strategy;
  6. }
  7. public void algorithm() {
  8. strategy.algorithm();
  9. }
  10. }

七、Xmind整理

在这里插入图片描述

下载地址

CSDN地址

  1. https://download.csdn.net/download/weixin_44624117/12840404

百度网盘

  1. 链接:https://pan.baidu.com/s/1qAAsPktlcCPYle0yHdkoyQ
  2. 提取码:f0zv

发表评论

表情:
评论列表 (有 0 条评论,108人围观)

还没有评论,来说两句吧...

相关阅读