设计模式入门:简单认识单例模式、模板方法、工厂模式、装饰模式、动态代理

目录

什么是设计模式

设计模式是针对软件设计中反复出现的问题 总结出的一套可复用、可扩展、易维护的通用解决方案

一、单例模式

概念

假设A类是个单例类

那就要知道 通过A拿对象 拿到的永远都是同一个对象

单例的实现方式很多 比如饿汉单例模式 懒汉单例模式等等

饿汉单例

一定要把构造器私有化

要获取的单例对象 随着单例类SingleInstance类加载的时候 就已经完成实例化


具体实现:

执行到Hungry.instance 用类名去拿静态资源的时候
肯定已经完成Hungry的类加载 与此同时 instance对象就同步地实例化了

且静态变量只加载一次 所以每次.instance拿到的都是同一个对象

懒汉单例

在真正需要单例对象的时候 才去创建一个对象(延迟加载对象)

懒汉单例最好把静态的单例对象也私有化 防止可能用类名.的方式直接拿到一个null


具体实现:

s1想获取对象的时候 判断是null 则进去new一个

而到了s2 s3的时候 不进去 直接返回之前new的对象

所以永远只会有同一个对象(输出结果表明 构造器也只被调用了一次)

一种错误写法:

每次调用此方法 new出来的都是新的对象

所以需要if判断

枚举实现单例

枚举也可以实现单例模式(构造器是私有的 只有X这一个对象) 而且线程安全

二、模板方法模式

使用场景

父类知道子类一定会完成某个功能 就把这个功能写成一个模板方法提供给子类 并且只完成确定的部分

而模板方法里不能确定实现的 就定义成抽象方法 让子类个性化实现

下图的write() 功能就是写一篇作文 只有正文部分是不一样的 就可以把它抽离成一个模板方法

并把正文部分写成抽象方法 让子类去个性化实现正文部分


大致实现步骤

案例--写作文

先写抽象类 把整个作文模版定义成一个模版方法:write()

在模版方法write()里先写好不变的开头和结尾 然后提供一个抽象方法writeMain()用来给子类写正文部分 并在模版方法write()里直接调用抽象方法writeMain()

让子类继承抽象类 个性化实现抽象方法writeMain()
子类对象需要写作文的时候 直接调用模板方法write()即可

抽象类(父类) write()就是一个模板方法:

两个子类:

测试类(子类对象调用父类中的模板方法 来写作文 ):

s调用write() write()里又调用writeMain() 也可以看成是就近原则(优先调用子类s重写过的writeMain)

建议模版方法用final修饰

模版方法最好用final修饰(他是给子类用的 不是给子类重写的)

比如上面学生抽象类里的模版方法write()

他是给子类(小学生 中学生) 作为一个作文模版直接去用的 不是给子类重写的(如果模板可以被随意重写 那他就不是一个模板了 )

子类要重写的是个性化writeMain()方法

三、工厂模式

工厂模式的思想是提供一个工厂方法返回对象

工厂方法可以为该对象进行加工和数据注入

四、装饰模式

装饰模式:创建一个新类 包装原始类 从而在新类中提升原来类的功能

1.定义父类

2.定义实现类 继续父类 定义功能

3.定义装饰实现类 继承父类 定义功能 包装原始类 增强功能

五、动态代理

public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)

参数一:类加载器,负责加载代理类到内存中使用

参数二:获取被代理对象实现的全部接口。代理要为全部接口的全部方法进行代理

参数三:代理的核心处理逻辑

模拟业务代码:

提供代理对象:

相关推荐
薛定谔的悦几秒前
光伏-储能-负荷联合预测:给 EMS 装上“预知能力“
java·数据库·人工智能·python·储能
大菜菜小个子几秒前
template<typename T>使用
java·开发语言·算法
Refrain_zc1 分钟前
Android开发: 拒绝 Activity 重建!onConfigurationChanged 实现平板横竖屏无缝切换
java
方也_arkling7 分钟前
【Java-Day15】API篇-ArrayList集合
java·开发语言
AI人工智能+电脑小能手8 分钟前
【大白话说Java面试题 第89题】【Mysql篇】第19题:Hash 索引和 B+ 树索引的区别?它们在使用方面的区别?
java·数据库·mysql·面试·哈希算法
我是一颗柠檬10 分钟前
【Java后端技术亮点】动态路由权限(按钮级权限),细粒度控制到按钮级别
java·开发语言·后端·状态模式
Fanfanaas12 分钟前
C++ 继承
java·开发语言·jvm·c++·学习·算法
蚰蜒螟13 分钟前
走进 Linux 内核:从 touch 命令到磁盘 inode 的完整旅程
java·linux·前端
zzqssliu17 分钟前
taocarts 跨境独立站 SEO 优化实践(多语言 + 反向海淘场景)
java·javascript·php
在繁华处25 分钟前
Java从零到熟练(十一):Spring框架入门
java·开发语言·spring