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

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

一、单例模式

1、简介

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

2、目的

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

3、结构图解

4、特点
  • 单例模式保证了类仅有一个实例,并为其提供了一个全局访问点。通过延迟初始化(仅在第一次使用它时才初始化),一个单例对象是达到此目的的通用做法。
  • 在多线程环境下,必须小心管理线程间的协作,因为它们访问单例对象方法与数据的时间,可能只有毫厘之差。
  • 对象具有唯一性,并不意味着使用了单例模式。单例模式通过隐藏构造函数,提供对象创建的唯一入口点。
  • 单例模式初始化时创建对象。
  • 只对外提供公共的getInstance方法,不提供任何公共构造函数。
5、代码
public class Singleton {
    //保证 instance 在所有线程中同步
    private static volatile Singleton instance = null;
    private Singleton() {
    }    //private 避免类在外部被实例化
    public static synchronized Singleton getInstance() {
        //getInstance 方法前加同步
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}
6、适用场景

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

二、工厂模式

1、简介

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

2、目的

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

3、结构图解

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

用户

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

产品力

//实体类产品
interface Product {
    public void use();
}
//具体产品A:实现抽象产品中的抽象方法
class ConcreteProductA implements Product {
    public void use() {
        System.out.println("具体产品A显示...");
    }
}

工厂类

//抽象工厂:提供了厂品的生成方法
interface Factory {
    public Product createProduct();
}
//具体工厂A:实现了厂品的生成方法
class ConcreteFactoryA implements Factory {
    @Override
    public Product createProduct() {
        System.out.println("具体工厂A生成-->具体产品A.");
        return new ConcreteProductA();
    }
}

三、装饰者模式

1、简介

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

2、目的

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

3、结构图解

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

用户

public class DecoratorPattern {
    public static void main(String[] args) {
        Component component = new ConcreteComponent();
        component.operation();
        System.out.println("---------------------------------");
        ConcreteDecorator decorator = new ConcreteDecorator(component);
        decorator.operation();
    }
}

构建角色

//抽象构件角色
interface Component {
    public void operation();
}
//具体构件角色
class ConcreteComponent implements Component {
    public ConcreteComponent() {
        System.out.println("创建具体构件角色");
    }
    public void operation() {
        System.out.println("调用具体构件角色的方法operation()");
    }
}

装饰角色

class ConcreteDecorator {
    private Component component;
    public ConcreteDecorator(Component component) {
        this.component = component;
    }
    public void operation() {
        component.operation();
        System.out.println("为具体构件角色增加额外的功能addBehavior()");
    }
}
6、使用场景
  • 适合需要(通过配置,如:diamond)来动态增减对象功能的场景。
  • 适合一个对象需要N种功能排列组合的场景(如果用继承,会使子类数量爆炸式增长)

四、代理模式

1、简介

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

2、目的

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

3、结构图解

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

用户

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

真实主题

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

代理类

//代理
class Proxy {
    private RealSubject realSubject;
    public void request() {
        realSubject = new RealSubject();
//        1、之前方法
        preRequest();
//        2、真实方法
        realSubject.request();
//        3、之后方法
        afterRequest();
    }
    //        1、之前方法
    public void preRequest() {
        System.out.println("访问真实主题之前的预处理。");
    }
    //        3、之后方法
    public void afterRequest() {
        System.out.println("访问真实主题之后的后续处理。");
    }
}

五、观察者模式

1、简介

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

2、目的

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

3、结构图解

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

用户

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

具体目标

//具体目标
class ConcreteSubject {
    protected List<Observer> observers = new ArrayList<Observer>();
    //增加观察者方法
    public void add(Observer observer) {
        observers.add(observer);
    }
//  调用观察者执行
    public void notifoy() {
        System.out.println("具体目标状态发生改变...");
        System.out.println("--------------");
        for (Observer obs : observers) {
            obs.process();
        }
    }
}

观察者A、B

//抽象观察者
interface Observer {
    void process(); //具体的处理
}
//具体观察者A
class ConcreteObserverA implements Observer {
    public void process() {
        System.out.println("具体观察者A处理!");
    }
}
//具体观察者B
class ConcreteObserverB implements Observer {
    public void process() {
        System.out.println("具体观察者B处理!");
    }
}

六、策略模式

1、简介

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

2、目的

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

3、结构图解

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

用户

public class StrategyPattern {
    public static void main(String[] args) {
//        1、创建环境类对象
        Context context = new Context();
//        2.1、创建策略类A对象
        Strategy strategyA = new ConcreteStrategyA();
//        3.1、将策略A添加到环境类中
        context.setStrategy(strategyA);
//        4.1、执行策略A方法
        context.algorithm();
        System.out.println("-----------------");
//        2.1、创建策略类B对象
        Strategy strategyB = new ConcreteStrategyB();
//        3.1、将策略B添加到环境类中
        context.setStrategy(strategyB);
//        4.1、执行策略B方法
        context.algorithm();
    }
}

策略类

//抽象策略类
interface Strategy {
    public void algorithm();    //策略方法
}
//具体策略类A
class ConcreteStrategyA implements Strategy {
    public void algorithm() {
        System.out.println("具体策略A的策略方法被访问!");
    }
}
//具体策略类B
class ConcreteStrategyB implements Strategy {
    public void algorithm() {
        System.out.println("具体策略B的策略方法被访问!");
    }
}

待解决问题

//环境类
class Context {
    private Strategy strategy;
    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }
    public void algorithm() {
        strategy.algorithm();
    }
}

七、Xmind整理

下载地址

CSDN地址

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

百度网盘

链接:https://pan.baidu.com/s/1qAAsPktlcCPYle0yHdkoyQ 
提取码:f0zv
目录
相关文章
|
6月前
|
设计模式 PHP
php设计模式--装饰模式(七)装饰模式完成文章编辑
php设计模式--装饰模式(七)装饰模式完成文章编辑
37 0
|
设计模式 自然语言处理 算法
一篇文章读懂六大设计模式
一篇文章读懂六大设计模式
118 0
一篇文章读懂六大设计模式
|
15天前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
|
2月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
17天前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###
|
10天前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
28 1
|
1月前
|
设计模式 Java Kotlin
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
本教程详细讲解Kotlin语法,适合希望深入了解Kotlin的开发者。对于快速学习Kotlin语法,推荐查看“简洁”系列教程。本文重点介绍了构建者模式在Kotlin中的应用与改良,包括如何使用具名可选参数简化复杂对象的创建过程,以及如何在初始化代码块中对参数进行约束和校验。
21 3
|
2月前
|
设计模式 算法 安全
设计模式——模板模式
模板方法模式、钩子方法、Spring源码AbstractApplicationContext类用到的模板方法
设计模式——模板模式

热门文章

最新文章

  • 1
    C++一分钟之-设计模式:工厂模式与抽象工厂
    42
  • 2
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    46
  • 3
    C++一分钟之-C++中的设计模式:单例模式
    54
  • 4
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    38
  • 5
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    62
  • 6
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    57
  • 7
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    41
  • 8
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    50
  • 9
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    106
  • 10
    Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
    78