一天了解23种设计模式

  学习设计模式之前,我们要知道为什么需要设计模式?想想你在初中、高中时是怎么做数学题的?每遇到一个难题,你不需要重头开始思考解决方法,而是有一定的解题“套路”。设计模式就像是解题的“套路”,一个好的“套路”应该适用于大多数题目,设计模式也是如此,一个好的设计模式不仅可以解决目前的问题,还可以很好地应对将来的变化。对于Java而言,只有运用好设计模式才能迈进J2EE的门槛。用一句话概括:设计模式就是为了提高代码的复用性,降低程序的耦合。

A. 创建模式

  1. 单例模式(Singleton)

  单例模式的目的是保证一个类只有一个实例,并且提供一个接口使用该实例。
  最佳实践:建立目录;建立数据库连接。
  一般单例模式通常有两种形式:饿汉式、懒汉式。

//饿汉式,在类的加载阶段就会创建该类的实例对象
public class girlFriend {
    private String name;
    private girlFriend(String name){
        this.name = name;
    }
    private static girlFriend gf = new girlFriend("gf");
    public static girlFriend getInstance(){
        return gf;
    }
}
//懒汉式,在类的初始化阶段创建该类的实例对象
public class girlFriend {
    private String name;
    private girlFriend(String name) {
        this.name = name;
    }
    private static girlFriend gf = null;
    public static synchronized girlFriend getInstance() {
        if(gf == null){
            gf = new girlFriend("gf");
        }
        return gf;
    }
}

懒汉式和饿汉式的区别:

  • 创建对象时机不同。
  • 懒汉式是线程不安全的,需要加锁;饿汉式是线程安全的。
  2. 工厂模式(Factory)

  工厂模式用于创建实例对象,一般有三种形式:简单工厂模式、工厂模式、抽象工厂模式。
  最佳实践:对象创建需要重用;未知该类需要创建多少子类对象
  ①简单工厂模式:核心工厂根据不同参数创建不同的对象(直接生产产品)。

public class simpleFactory {
    public static product createProduct(int type) {
        if(type == 1) {
            return new product1();
        } else if(type == 2){
            return new product2();
        }
        return null;
    }
    public static void main(String[] args) {
        product product1 = simpleFactory.createProduct(1);
        product1.print();
    }
}

abstract class product{
    public abstract void print();
}

class product1 extends product{
    public void print(){
        System.out.println("产品1");
    }
}

class product2 extends product{
    public void print(){
        System.out.println("产品2");
    }
}

  ②工厂模式:核心工厂的子类决定生产产品。核心工厂只需要定义创建对象的接口,这样可以使类的实例化延迟到其子类。

public class factory {
    public static void main(String[] args) {
        productFactory p1f = new product1Factory();
        product p = p1f.getProduct();
        p.print();
    }
}

interface product{
    void print();
}

interface productFactory{
    product getProduct();
}

class product1 implements product{
    public void print(){
        System.out.println("产品1");
    }
}

class product2 implements product{
    public void print(){
        System.out.println("产品2");
    }
}

class product1Factory implements productFactory{
    @Override
    public product getProduct(){
        return new product1();
    }
}

class product2Factory implements productFactory{
    @Override
    public product getProduct(){
        return new product2();
    }
}

  ③抽象工厂模式:具体工厂类可以创建多个对象。

public class factory {
    public static void main(String[] args) {
        specificFactory sf = new specificFactory();
        Computer legion = sf.getLegionComputer();
        Phone apple = sf.getApplePhone();
        legion.print();
        apple.print();
    }
}

//产品1->电脑
interface Computer{
    void print();
}
class legion implements Computer{
    @Override
    public void print() {
        System.out.println("legion");
    }
}

//产品2->手机
interface Phone{
    void print();
}
class apple implements Phone{
    @Override
    public void print() {
        System.out.println("apple");
    }
};

//抽象工厂
interface abstractFactory{
    Computer getLegionComputer();
    Phone getApplePhone();
}

//具体工厂
class specificFactory implements abstractFactory{
    @Override
    public Computer getLegionComputer() {
        return new legion();
    }
    @Override
    public Phone getApplePhone() {
        return new apple();
    }
}
  3. 建造者模式(Builder)

  建造者模式适用于将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的对象,解耦过程与产品。
  经典的Builder模式用Builder接口定义如何创建复杂对象,用Director类构建最后的复杂对象,即组装最后成品。
  最佳实践:创建属性很多的复杂对象,以下代码实现(最佳实践中并没有使用到Director类构建最后的对象,而是通过链式结构控制构建过程;也没有单独定义Builder接口,而是使用静态内部类代替Builder接口的实现类。这也说明了设计模式不是原封不动地套用,需要开发者在实践中具体问题具体分析)。

// Person类->含有很多字段的复杂对象
class Person {
    private String name;
    private int age;
    private String gender;
    private String address;
    private String phone;
    private String email;
    private int id;
    private String password;
    private String city;
    private String state;
    private Person(){}
    public static class personBuilder{ // 静态内部类,代替了Builder接口的实现类
        Person p = new Person();
        public personBuilder setInfo(String name, int age, String gender){
            p.name = name;
            p.age = age;
            p.gender = gender;
            return this;
        }
        public personBuilder setAddress(String address){
            p.address = address;
            return this;
        }
        public personBuilder setPhone(String phone){
            p.phone = phone;
            return this;
        }
        public personBuilder setAccount(int id, String password, String email, String state){
            p.id = id;
            p.password = password;
            p.email = email;
            p.state = state;
            return this;
        }
        public personBuilder setCity(String city){
            p.city = city;
            return this;
        }
        public Person build(){
            return p;
        }
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", gender='" + gender + '\'' +
                ", address='" + address + '\'' +
                ", phone='" + phone + '\'' +
                ", email='" + email + '\'' +
                ", id=" + id +
                ", password='" + password + '\'' +
                ", city='" + city + '\'' +
                ", state='" + state + '\'' +
                '}';
    }
}

public class Builder{
    public static void main(String[] args) {
     	//链式结构构建对象,代替Director类功能
        Person p = new Person.personBuilder()
                .setInfo("wistain", 22, "male")
                .setAccount(1, "123", "123456@qq.com", "在职")
                .build();
        System.out.println(p);
    }
}

B. 结构模式

C. 行为模式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/742364.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python遍历文件夹中所有图片

python遍历文件夹中的图片-CSDN博客 这个是之前的版本,现在这个版本会更好,直接进来就在列表中 path glob.glob("1/*.jpg")print(path)print(len(path))path_img glob.glob("1/*.jpg")path_img.extend(path)print(len(path_img))…

基于Hexo+GITHUB搭建个人博客网站(PS:不用域名,不用服务器,重点是免费,小白也能轻松掌握)

✌ 作者名字:高峰君主 📫 如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀 💬 人生格言:没有我不会的语言,没有你过不去的坎儿。💬 &#x1f5…

25.模式和匹配

目录 一、概念二、模式的位置2.1 match分支2.2 if let表达式2.3 while let条件循环2.4 for循环2.5 let语句2.6 函数参数 三、模式是否会匹配失效四、模式语法4.1 匹配字面量4.2 匹配命名变量4.3 解构并分解值1)解构结构体2)解构枚举3)解构嵌套…

动态规划数字三角形模型——AcWing 1015. 摘花生

动态规划数字三角形模型 定义 动态规划数字三角形模型是在一个三角形的数阵中,通过一定规则找到从顶部到底部的最优路径或最优值。 运用情况 通常用于解决具有递推关系、需要在不同路径中做出选择以达到最优结果的问题。比如计算最短路径、最大和等 注意事项 …

MySQL之复制(十一)

复制 复制的问题和解决方案 数据损坏或丢失的错误 当一个二进制日志损坏时,能恢复多少数据取决于损坏的类型,有几种比较常见的类型: 1.数据改变,但事件仍是有效的SQL 不幸的是,MySQL甚至无法察觉这种损坏。因此最好还是经常检查…

【小程序】聊天功能

文章目录 聊天功能实现功能实现思路后端前端效果展示 聊天功能 实现功能 要实现一个聊天机器人,它能够解答用户疑问,并且能够识别到用户聊天的主题,涉及到饮食方面时,会自动决定是否要去数据库中读取用户的相关喜好信息&#xf…

录音怎么转文字更高效?5款软件带你轻松拿捏文本转换~

临近大学生们最难熬的期末考试周,如何在短时间内复习完所有必考的科目也就成为大家迫在眉睫的首要任务。 想要在复习的过程中,更加高效地捕捉和整理关键信息、提高学习效率,那么录音转文字免费应用无疑是你的一大好帮手! 倘若你…

YOLOv5改进 | SPPF | 具有多尺度带孔卷积层的ASPP【CVPR2018】

💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 专栏目录: 《YOLOv5入门 改进涨点》专栏介绍 & 专栏目录 |目前已有40篇内容,内含各种Head检测头、损失函数Loss、…

设计模式5-策略模式(Strategy)

设计模式5-策略模式 简介目的定义结构策略模式的结构要点 举例说明1. 策略接口2. 具体策略类3. 上下文类4. 客户端代码 策略模式的反例没有使用策略模式的代码 对比分析 简介 策略模式也是属于组件协作模式一种。现代软件专业分工之后的第一个结果是框架语音应用程序的划分。组…

WEB界面上使用ChatGPT

(作者:陈玓玏) 开源项目,欢迎star哦,https://github.com/tencentmusic/cube-studio 随着大模型不断发展,现在无论写代码,做设计,甚至老师备课、评卷都可以通过AI大模型来实现了&…

【数据结构与算法】动态查找表(二叉排序树,二叉平衡树)详解

二叉排序树的数据结构。 struct TreeNode {ElemType data;TreeNode *left, *right; }; using BiTree TreeNode *;结构体包含三个成员: data 是一个 ElemType 类型的变量,用于存储二叉搜索树节点的数据。left 是一个指向 TreeNode 类型的指针&#xff…

【Pandas驯化-16】一文搞懂Pandas中高性能query、eval函数技巧

【Pandas驯化-16】一文搞懂Pandas中高性能query、eval函数技巧 本次修炼方法请往下查看 🌈 欢迎莅临我的个人主页 👈这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合,智慧小天地! 🎇 相关内容文档获取 微信公众…

Linux命令学习2

一.文件基础命令 1.alias-给某个命令取别名 使用方式:alias cl ls -la 说明:将ls -la命令取别名为cl,使用这种方式只是临时将命令取别名,重启中断后,就会失效。 问题1:如何永久性的设置命令的别名? 答…

生命在于学习——Python人工智能原理(4.3)

三、Python的数据类型 3.1 python的基本数据类型 3.1.4 布尔值(bool) 在Python中,布尔值是表示真或假的数据类型,有两个取值,True和False,布尔值常用于控制流程、条件判断和逻辑运算,本质上来…

ONLYOFFICE 桌面编辑器 8.1全新发布,更强大的编辑工具

ONLYOFFICE 8.1 一、什么是ONLYOFFICE?二、怎么安装 ONLYOFFICE 8.1三、主要功能介绍四、总结 一、什么是ONLYOFFICE? ONLYOFFICE 是一款功能强大的办公套件,旨在提供全面的文档、表格和演示文稿编辑解决方案。它集成了文字处理、电子表格和演…

基于 Native 技术加速 Spark 计算引擎

本文整理自 2024 年 6 月 DataFunSummit 2024 OLAP 架构峰会 Lakehouse 湖仓一体化架构论坛的同名主题分享。 今天分享的主题是基于 Native 技术加速 Spark 计算引擎,大家将会了解到如何基于 ClickHouse 来改造 Spark 引擎,最终获得较为可观的性能提升。…

正则表达式以及文本三剑客grep、sed、awk

正则表达式匹配的是文本内容,文本三剑客都是针对文本内容。 grep:过滤文本内容 sed:针对文本内容进行增删改查 awk:按行取列 一、grep grep的作用使用正则表达式来匹配文本内容 1、grep选项 -m:匹配几次之后停止…

第10章 启动过程组 (启动过程组的重点工作)

第10章 启动过程组 10.3启动过程组的重点工作,在第三版教材第362~364页; 文字图片音频方式 第一个知识点:项目启动会议 1、作用 标志着对项目经理责权的定义结果的正式公布,通常由项目经理负责组织和召开。2、目的 使项目各…

2024 cicsn 西南赛区 半决赛

文章目录 前言mcmf结构定义添加边遍历邻接点示例场景解决步骤1. 初始化2. 应用SPFA找最小费用增广路径 3. 增广操作4. 终止条件 结果分析 逆向maincaldeladdedit 思路expvlunexp qeme启动不行保护逆向 题目给的脚本模版 前言 不能联网搜是真坐牢 本来想等着全写了再发的&#…

我终于毕业啦!

2024-6-24,星期一,19:21,天气:阴转小雨,心情:晴。大家好啊,“失踪人员”回归啦,整整断更了两周,这两周发生了很多事,第一件就是我的毕业答辩通过啦&#xff0…