【Java】网络编程,JUnit单元测试,设计模式(二)

简介: 【Java】网络编程,JUnit单元测试,设计模式

3.3 断言


  • 概述 :

预先判断某个条件一定成立,如果条件不成立,则直接报错。

  • 使用 :
//第一个参数表示期望值
//第二个参数表示实际值
// 如果实际值和期望值相同,说明结果正确就测试通过,如果不相同,说明结果是错误的,就会报错
Assert.assertEquals( 期望值, 实际值);
Assert.assertEquals("异常原因", 期望值, 实际值);
//例如:
int result = add(100,200);
Assert.assertEquals(300, result);  
小结 : 如何进行断言
Assert.assertEquals(期望值,实际值)

4 单例设计模式


学习目标


  • 能够使用单例设计模式设计代码

内容讲解


  • 正常情况下一个类可以创建多个对象
public static void main(String[] args) {
  // 正常情况下一个类可以创建多个对象
  Person p1 = new Person();
  Person p2 = new Person();
  Person p3 = new Person();
}
  • 如果说有时一个对象就能搞定的事情 , 非要创建多个对象 , 浪费内存!!!

4.1 单例设计模式的作用


  • 单例模式,是一种常用的软件设计模式。通过单例模式可以保证项目中,应用该模式的这个类只有一个实例。
  • 即一个类只有一个对象实例。
  • 好处 :可以节省内存,共享数据

4.2 单例设计模式实现步骤


  1. 将构造方法私有化,使其不能在类的外部通过new关键字实例化该类对象。
  2. 在该类内部产生一个唯一的实例化对象,并且将其封装为private static 类型的成员变量。
  3. 定义一个静态方法返回这个唯一对象。

4.3 单例设计模式的类型


根据创建对象的时机单例设计模式又分为以下两种:

  1. 饿汉单例设计模式
  2. 懒汉单例设计模式

4.4 饿汉单例设计模式


  • 饿汉单例设计模式就是使用类的时候已经将对象创建完毕
    不管以后会不会使用到该实例化对象,先创建了再说。很着急的样子,故被称为“饿汉模式”。
  • 代码如下:
public class Singleton {
    // 1.将构造方法私有化,使其不能在类的外部通过new关键字实例化该类对象。
    private Singleton() {}
    // 2.在该类内部产生一个唯一的实例化对象,并且将其封装为private static 类型的成员变量。
    private static final Singleton instance = new Singleton();
    // 3.定义一个静态方法返回这个唯一对象。
    public static Singleton getInstance() {
        return instance;
    }
}

需求:定义一个皇帝类,要求对象只能存在一个。

package com.itheima.singledesign;
/*
    需求 : 使用单例模式(饿汉式) , 要求此类只能有一个对象
    步骤 :
        1. 将构造方法私有化,使其不能在类的外部通过new关键字实例化该类对象。
        2. 在该类内部产生一个唯一的实例化对象,并且将其封装为private static 类型的成员变量。
        3. 定义一个静态方法返回这个唯一对象。
 */
public class King {
    // 1. 将构造方法私有化,使其不能在类的外部通过new关键字实例化该类对象。
    private King(){
    }
    // 2. 在该类内部产生一个唯一的实例化对象,并且将其封装为private static 类型的成员变量。
    private static final King KING = new King();
    // 3. 定义一个静态方法返回这个唯一对象。
    public static King getInstance(){
        return KING;
    }
}

4.5 懒汉单例设计模式


  • 懒汉单例设计模式就是调用getInstance()方法时对象才被创建
    也就是说先不急着实例化出对象,等要用的时候才实例化出对象。不着急,故称为“懒汉模式”。
    代码如下:
  • public class Singleton {
 // 1.将构造方法私有化,使其不能在类的外部通过new关键字实例化该类对象。
private Singleton() {}
// 2.在该类内部产生一个唯一的实例化对象,并且将其封装为private static类型的成员变量。
private static Singleton instance;
// 3.定义一个静态方法返回这个唯一对象。要用的时候才例化出对象
public static synchronized Singleton getInstance() {
    if(instance == null) {
        instance = new Singleton();
    }
    return instance;
}
- ##### 注意 :
- 懒汉单例设计模式在多线程环境下可能会实例化出多个对象,不能保证单例的状态,所以加上关键字:synchronized,保证其同步安全。
- 需求:使用懒汉单例 ,改写皇帝类的单例模式
```java
package com.itheima.singledesign;
/*
    需求 : 使用单例模式(懒汉式) , 要求此类只能有一个对象
    步骤 :
        1. 将构造方法私有化,使其不能在类的外部通过new关键字实例化该类对象。
        2. 在该类内部定义一个private static修饰的成员变量 . 此变量不需要赋值
        3. 定义一个静态方法返回这个唯一对象。 此方法需要加上synchronized关键字保证在多线程中也只有一个实例对象
 */
public class King2 {
    // 1. 将构造方法私有化,使其不能在类的外部通过new关键字实例化该类对象。
    private King2() {
    }
    //  2. 在该类内部定义一个private static修饰的成员变量 . 此变量不需要赋值
    private static King2 king2;
    // 3. 定义一个静态方法返回这个唯一对象。 此方法需要加上synchronized关键字保证在多线程中也只有一个实例对象
    public static synchronized King2 getInstance() {
        if (king2 == null) {
            king2 = new King2();
        }
        return king2;
    }
}

知识小结

  • 单例模式可以保证系统中一个类只有一个对象实例。
  • 实现单例模式的步骤:
  • 将构造方法私有化,使其不能在类的外部通过new关键字实例化该类对象。
  • 在该类内部产生一个唯一的实例化对象,并且将其封装为private static类型的成员变量。
  • 定义一个静态方法返回这个唯一对象。

5 多例设计模式


学习目标


  • 能使用多例设计模式设计代码

内容讲解


5.1 多例设计模式的作用


  • 多例模式,是一种常用的设计模式之一。通过多例模式可以保证项目中,应用该模式的类有固定数量的实例
  • 多例类要自我创建并管理自己的实例,还要向外界提供获取本类实例的方法。
  • 使用场景:线程池
线程池 = Executors.newFixedThreadPool(3);

5.2.实现步骤


1.创建一个类, 将构造方法私有化,使其不能在类的外部通过new关键字实例化该类对象。

2.在类中定义该类被创建对象的总数量

3.在类中定义存放类实例的list集合

4.在类中提供静态代码块,在静态代码块中创建类的实例

5.提供获取类实例的静态方法

5.3.实现代码


  • 某一个学科有固定3位老师,年级中上该课程的老师就是这三位老师其中一位
    要求使用多例模式 ,每次获取的都是这三位老师其中一位
package com.itheima.moreinstance_demo;
import java.util.ArrayList;
import java.util.Random;
/*
    需求  : 某一个学科有固定3位老师,年级中上该课程的老师就是这三位老师其中一位
            要求使用多例模式 ,每次获取的都是这三位老师其中一位
    实现步骤 :
        1.创建一个类,  将构造方法私有化,使其不能在类的外部通过new关键字实例化该类对象。
        2.在类中定义该类被创建对象的总数量
        3.在类中定义存放类实例的list集合
        4.在类中提供静态代码块,在静态代码块中创建类的实例
        5.提供获取类实例的静态方法
 */
public class Teacher {
    // 1.创建一个类,  将构造方法私有化,使其不能在类的外部通过new关键字实例化该类对象。
    private Teacher() {
    }
    // 2.在类中定义该类被创建对象的总数量
    private static int maxCount = 3;
    // 3.在类中定义存放类实例的list集合
    private static ArrayList<Teacher> list = new ArrayList<>();// {teacher1  , teacher2 , teacher3}
    // 4.在类中提供静态代码块,在静态代码块中创建类的实例
    static {
        for (int i = 0; i < maxCount; i++) {
            list.add(new Teacher());
        }
    }
    // 5.提供获取类实例的静态方法
    public static Teacher getInstance() {
        int index = new Random().nextInt(3);// [0 - 2]
        return list.get(index);
    }
}

5.4 小结


  • 多例模式作用 : 可以保证项目中一个类有固定个数的实例, 在实现需求的基础上, 能够提高实例的复用性.
    实现多例模式的步骤 :
  • 创建一个类, 将构造方法私有化,使其不能在类的外部通过new关键字实例化该类对象。
  • 在类中定义该类被创建的总数量
  • 在类中定义存放类实例的list集合
  • 在类中提供静态代码块,在静态代码块中创建类的实例
  • 提供获取类实例的静态方法

6 工厂设计模式


学习目标


  • 能够使用工厂设计模式设计代码

内容讲解


6.1 概述


  • 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。之前我们创建类对象时, 都是使用 new 对象的形式创建, 除new 对象方式以外, 工厂模式也可以创建对象.

6.2 作用


  • 解决类与类之间的耦合问题

6.3案例实践


  • 需求:定义汽车工厂类,生产各种品牌的车
  • 实现步骤
  • 编写一个Car接口, 提供run方法
  • 编写一个Falali类实现Car接口,重写run方法
  • 编写一个Benchi类实现Car接口,重写run方法
  • 提供一个CarFactory(汽车工厂),用于生产汽车对象
  • 定义CarFactoryTest测试汽车工厂

实现代码


package com.itheima.factorydesign_demo;
/*
  - 需求:定义汽车工厂类,生产各种品牌的车
  - 实现步骤
      - 编写一个Car接口, 提供run方法
      - 编写一个Falali类实现Car接口,重写run方法
      - 编写一个Benchi类实现Car接口
      =============================================
      - 提供一个CarFactory(汽车工厂),用于生产汽车对象
      - 定义CarFactoryTest测试汽车工厂
 */
public class CarTest {
    public static void main(String[] args) {
        Car benchi = CarFactory.getInstance(Brand.BENCHI);
        System.out.println(benchi);
    }
}
// 汽车接口
interface Car {
    public abstract void run();
}
// 编写一个Falali类实现Car接口,重写run方法
class Falali implements Car {
    public Falali() {
    }
    @Override
    public void run() {
        System.out.println("法拉利破百需要3秒...");
    }
}
// 编写一个Benchi类实现Car接口
class Benchi implements Car {
    @Override
    public void run() {
        System.out.println("奔驰破百需要5秒...");
    }
}
// 汽车品牌枚举
enum Brand {
    BENCHI, FALALI, BAOMA, BINLI, AODI;
}
// 提供一个CarFactory(汽车工厂),用于生产汽车对象
class CarFactory {
    private CarFactory() {
    }
    public static Car getInstance(Brand brand) {
        switch (brand) {
            case FALALI:
                return new Falali();
            case BENCHI:
                return new Benchi();
            default:
                return null;
        }
    }
}
 提供一个CarFactory(汽车工厂),用于生产汽车对象
//class CarFactory{
//    private CarFactory(){}
//
//    public static Car getInstance(String brand) {
//        if(brand.equals("Falali")){
//            return new Falali(10);
//        }else if(brand.equals("Benchi")) {
//            return new Benchi();
//        }else {
//            return null;
//        }
//    }
//}

知识小结


  • 工厂模式的存在可以改变创建对象的方式,降低类与类之间的耦合问题.
相关文章
|
2月前
|
设计模式 Java Spring
Java 设计模式之责任链模式:优雅处理请求的艺术
责任链模式通过构建处理者链,使请求沿链传递直至被处理,实现发送者与接收者的解耦。适用于审批流程、日志处理等多级处理场景,提升系统灵活性与可扩展性。
286 2
|
2月前
|
设计模式 网络协议 数据可视化
Java 设计模式之状态模式:让对象的行为随状态优雅变化
状态模式通过封装对象的状态,使行为随状态变化而改变。以订单为例,将待支付、已支付等状态独立成类,消除冗长条件判断,提升代码可维护性与扩展性,适用于状态多、转换复杂的场景。
325 0
|
4月前
|
设计模式 缓存 Java
Java设计模式(二):观察者模式与装饰器模式
本文深入讲解观察者模式与装饰器模式的核心概念及实现方式,涵盖从基础理论到实战应用的全面内容。观察者模式实现对象间松耦合通信,适用于事件通知机制;装饰器模式通过组合方式动态扩展对象功能,避免子类爆炸。文章通过Java示例展示两者在GUI、IO流、Web中间件等场景的应用,并提供常见陷阱与面试高频问题解析,助你写出灵活、可维护的代码。
|
2月前
|
设计模式 算法 搜索推荐
Java 设计模式之策略模式:灵活切换算法的艺术
策略模式通过封装不同算法并实现灵活切换,将算法与使用解耦。以支付为例,微信、支付宝等支付方式作为独立策略,购物车根据选择调用对应支付逻辑,提升代码可维护性与扩展性,避免冗长条件判断,符合开闭原则。
333 35
|
2月前
|
设计模式 消息中间件 传感器
Java 设计模式之观察者模式:构建松耦合的事件响应系统
观察者模式是Java中常用的行为型设计模式,用于构建松耦合的事件响应系统。当一个对象状态改变时,所有依赖它的观察者将自动收到通知并更新。该模式通过抽象耦合实现发布-订阅机制,广泛应用于GUI事件处理、消息通知、数据监控等场景,具有良好的可扩展性和维护性。
271 8
|
2月前
|
Java 测试技术 数据库连接
【SpringBoot(四)】还不懂文件上传?JUnit使用?本文带你了解SpringBoot的文件上传、异常处理、组件注入等知识!并且带你领悟JUnit单元测试的使用!
Spring专栏第四章,本文带你上手 SpringBoot 的文件上传、异常处理、组件注入等功能 并且为你演示Junit5的基础上手体验
870 2
|
2月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
185 1
|
2月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
209 1
|
2月前
|
机器学习/深度学习 分布式计算 Java
Java与图神经网络:构建企业级知识图谱与智能推理系统
图神经网络(GNN)作为处理非欧几里得数据的前沿技术,正成为企业知识管理和智能推理的核心引擎。本文深入探讨如何在Java生态中构建基于GNN的知识图谱系统,涵盖从图数据建模、GNN模型集成、分布式图计算到实时推理的全流程。通过具体的代码实现和架构设计,展示如何将先进的图神经网络技术融入传统Java企业应用,为构建下一代智能决策系统提供完整解决方案。
349 0
|
4月前
|
设计模式 安全 Java
Java设计模式(一):单例模式与工厂模式
本文详解单例模式与工厂模式的核心实现及应用,涵盖饿汉式、懒汉式、双重检查锁、工厂方法、抽象工厂等设计模式,并结合数据库连接池与支付系统实战案例,助你掌握设计模式精髓,提升代码专业性与可维护性。