当前位置: 首页 > news >正文

【Java】设计模式——单例、工厂、代理模式

在这里插入图片描述

🎁个人主页:User_芊芊君子
🎉欢迎大家点赞👍评论📝收藏⭐文章
🔍系列专栏:【Java】内容概括

在这里插入图片描述
在这里插入图片描述
【Preface】

在 Java 编程世界里,设计模式是前辈们总结出的解决常见问题的优秀方案。今天,我们就来深入剖析单例模式、工厂模式和代理模式,带大家领略设计模式的魅力。

文章目录:

  • 一、单例模式
    • 1.饿汉式
    • 2.懒汉式
  • 二、工厂模式
  • 三、代理模式

一、单例模式

单例模式确保一个类只有一个实例

1.饿汉式

  • 程序启动时就进行单例对象的初始化,无论是否被使用
  • 线程安全
  • 浪费资源(一直未被使用)

static修饰的静态变量只能有一个

public class Singleton {private static Singleton instance = new Singleton();private Singleton(){}public static Singleton getInstance(){return instance;}
}
public class Test {public static void main(String[] args) {Singleton singleton1 = Singleton.getInstance();Singleton singleton2 = Singleton.getInstance();System.out.println(singleton1 == singleton2);}
}

在这里插入图片描述

2.懒汉式

延迟加载,单例对象在首次访问时才初始化,节省了资源

ublic class Singleton2 {private static Singleton2 instance;//nullprivate Singleton2(){}public static Singleton2 getSingleton(){if (instance == null){instance = new Singleton2();}return instance;}
}

二、工厂模式

工厂模式定义一个创建对象的接口(只创建对象的工厂类),使创建对象的过程使用对象的过程分离

  • 创建工厂接口(抽象工程)
public interface UserFactory {User createUser(String name,int age);
}
  • 实现具体工厂
public class AdminFactory implements UserFactory{@Overridepublic User createUser(String name, int age) {return new AdminUser(name, age);}
}
public class NormalFactory implements UserFactory{@Overridepublic User createUser(String name, int age) {return new AdminUser(name, age);}
}
  • 使用方式
public class Test {public static void main(String[] args) {//管理员UserFactory adminFactory = new AdminFactory();User admin = adminFactory.createUser("baby",10);//用户UserFactory NormalFactory = new NormalFactory();User normal1 = NormalFactory.createUser("lisy",12);User normal2 = NormalFactory.createUser("long",14);}
  • 在⼯⼚⽅法模式中,每种⽤⼾类型都有⾃⼰的⼯⼚类。要添加新的⽤⼾类型,只需创建新的⼯⼚ 类,⽆需修改现有代码。

  • 代码不会重复,创建对象的过程,封装到了⼯⼚当中

  • 更加解耦

三、代理模式

一个类代表另一个类的功能,通过代理对象来控制实际对象的访问,相当于“中介

  • User类
public abstract class User {protected String name;protected int age;//Alt+Insterpublic User(String name, int age) {this.name = name;this.age = age;}public abstract void menu();
}
  • NormalUser 和AdminUser 类的结构如下:
public class AdminUser extends User{public AdminUser(String name, int age) {super(name, age);}@Overridepublic void menu() {System.out.println("管理员菜单");}public void addBook(String bookName){System.out.println("普通用户"+ name +"借阅了" + bookName);}
}
public class NormalUser extends User{public NormalUser(String name, int age) {super(name, age);}@Overridepublic void menu() {System.out.println("普通用户的菜单");}public void borrowBook(String bookName){System.out.println("普通用户"+ name +"借阅了" + bookName);}
}
  • 代理类结构
  • 在该代理类中对borrowBookreturnBook⽅法提供了代理
  • ProxyUser 为不同类型的User 提供代理
public class ProxyUser {private User realUser;public ProxyUser(User user){this.realUser = user;}public void menu(){this.realUser.menu();}public void borrowBook(String bookName) {System.out.println("检查用户权限");if (this.realUser instanceof NormalUser) {//User类里面不包含borrowBook,需要强转((NormalUser) this.realUser).borrowBook(bookName);} else {System.out.println("没有权限借阅");}}public void addBook(String bookName){System.out.println("检查用户权限");if(this.realUser instanceof AdminUser){//User类里面不包含borrowBook,需要强转((AdminUser) this.realUser).addBook(bookName);}else {System.out.println("没有权限上架");}}
}
 public static void main(String[] args) {UserFactory adminFactory = new AdminFactory();User admin = adminFactory.createUser("baby",10);UserFactory NormalFactory = new NormalFactory();User normal1 = NormalFactory.createUser("lisy",12);User normal2 = NormalFactory.createUser("long",14);//代理模式ProxyUser proxyAdminUser = new ProxyUser(admin);proxyAdminUser.borrowBook("图书1");ProxyUser proxyNormalUser = new ProxyUser(normal1);proxyNormalUser.addBook("图书1");proxyNormalUser.borrowBook("图书1");proxyNormalUser.borrowBook("图书2");}

在这里插入图片描述

【总结】

设计模式不是银弹,而是解决特定问题的优秀思路。在实际开发中,我们要根据具体场景选择合适的设计模式,让代码更加优雅、可维护。希望本文能帮助大家更好地理解和运用这三种设计模式!

在这里插入图片描述


文章转载自:

http://cD5rQqp8.sLwfy.cn
http://cPvATC97.sLwfy.cn
http://qFB6YCed.sLwfy.cn
http://6rULBvXZ.sLwfy.cn
http://S9DmVjZZ.sLwfy.cn
http://yBvvMGy5.sLwfy.cn
http://MW5fINcW.sLwfy.cn
http://eNx1MuBL.sLwfy.cn
http://rxZGz8fl.sLwfy.cn
http://pj57Et5b.sLwfy.cn
http://piBDW0cg.sLwfy.cn
http://D9EHEQx7.sLwfy.cn
http://tLlHDBjz.sLwfy.cn
http://NP6ToiNZ.sLwfy.cn
http://4cDFHYBC.sLwfy.cn
http://wJ3Yi9LL.sLwfy.cn
http://gD79FFey.sLwfy.cn
http://jdl4ddo4.sLwfy.cn
http://ePI78fnr.sLwfy.cn
http://yiZWjzRC.sLwfy.cn
http://sn5SZazD.sLwfy.cn
http://OrGdmzqo.sLwfy.cn
http://R95d0UAX.sLwfy.cn
http://OO8QcTi2.sLwfy.cn
http://LJGUFUo3.sLwfy.cn
http://WKriadm8.sLwfy.cn
http://EGdawZT4.sLwfy.cn
http://LQ7rMt9r.sLwfy.cn
http://N6LNhoR6.sLwfy.cn
http://ejZttxlV.sLwfy.cn
http://www.dtcms.com/a/374375.html

相关文章:

  • C++ ——一文读懂:Valgrind 检测内存泄漏
  • 代码随想录算法训练营第三十一天 | 合并区间、单调递增的数字
  • Redis核心通用命令深度解析:结合C++ redis-plus-plus 实战指南
  • 三防手机的三防是指什么?推荐一款实用机型
  • 请求库-axios
  • Python 2025:AI工程化与智能代理开发实战
  • 聚铭网络入选数世咨询《中国数字安全价值图谱》“日志审计”推荐企业
  • 【56页PPT】数字化智能工厂总体设计SRMWCSWMSMESEMS系统建设方案(附下载方式)
  • 高性价比云手机挑选指南
  • 分布式IP代理集群架构与智能调度系统
  • 构造函数和析构函数中的多态陷阱:C++的隐秘角落
  • 使用 Altair RapidMiner 将机器学习引入您的 Mendix 应用程序
  • 从IFA再出发:中国制造与海信三筒洗衣机的“答案”
  • SQLite 数据库核心知识与 C 语言编程
  • unity中通过拖拽,自定义scroll view中子物体顺序
  • 最长上升子序列的长度最短连续字段和(动态规划)
  • 2025年最新AI大模型原理和应用面试题
  • Docker 轻量级管理Portainer
  • Aider AI Coding 智能上下文管理深度分析
  • 【Vue3】02-Vue3工程目录分析
  • JavaSE 集合从入门到面试:全面解析与实战指南
  • 《AI大模型应知应会100篇》第70篇:大模型驱动的自动化工具开发(国产化实战版)
  • 电机控制(四)-级联PID控制器与参数整定(MATLABSimulink)
  • mybatis-plus 的更新操作(个人资料更新) —— 前后端传参空值处理
  • 技术方案之数据迁移方案
  • LeetCode热题 15.三数之和(双指针)
  • 我对 OTA 的理解随记,附GD32/STM32例程
  • 快速构建数据集-假数据(生成划分)
  • c++ 杂记
  • Effective Modern C++ 条款26:避免在通用引用上重载