- 设计模式是⼀整套的思想,在不同的场景合理的运⽤可以提升整体的架构的质量。永远不要想着去硬凑设计模式,否则将会引起过渡设计,以及在承接业务反复变化的需求时造成浪费的开发和维护成本。
- 初期是代码的优化,中期是设计模式的使⽤,后期是把控全局服务的搭建。不断的加强⾃⼰对全局能⼒的把控,也加深⾃⼰对细节的处理。可上可下才是⼀个程序员最佳处理⽅式,选取做合适的才是最好的选择。
最近找了一个设计模式的PDF来学习一下. 并记录一下个人学习笔记 来源如下:
贴一下这个作者的源码地址: github.com/fuzhengwei/…
设计模式还是非常重要的, 学习设计模式一方面是为了提高代码质量, 更规范, 优雅 性能更好的写代码, 另一方面就是为自己读框架书做准备
哦还有一方面原因, 李某人一定要做一个有工匠精神的从业者🙄
开始.
在当前工作的crud业务中, 我对于有限的几种判断都是if else解决问题 要么走方法一 要么走方法二 要说扩展性 那就是加一个else if
1 工厂方法
我大致理解为它把接口规范了一下,然后把if else写得更优雅了....
2 抽象工厂
模型思路
图一: 那个RedisUtils是本系统的,可以在ApiTest里面第二部分那样直接调用, 这里我为了更好的理解, 所以也抽象成了跟另两个一样的方式 以做到统一 并在ApiTest的第三部分里面测试成功
图二: 通过断点调试 看到返回的已经是代理对象了 (根据入参决定的)
这里面使用的JDK动态代理InvocationHandler(里面又包含反射invoke)来实现这个功能,所以调试的时候不管是调用get还是set方法 都会经过JDKInvocetionHandler这个类里面的invoke方法(因为是代理类调用) 然后到真实类里面的get set方法
当我把方法名改成set1(原来是set)之后, 代码在代理对象获取方法的时候就报错了 找不到该方法 set1
总结一下(个人学习心得):
这个抽象工厂的当前场景, 不同的系统都是使用Redis, 但各自系统的方法命名不同, 那么就定义一个规范的接口 各自实现该接口来达到方法统一 然后在各自内部创建属于自己的对象,调用自己的接口名 因为实现了同一个接口, 就可以通过动态代理返回代理出来的特定的子类,使用父类作为接收对象,然后调方法时, 使用的就是 代理子类调用方法并经过InvocationHandler内获取到方法并使用反射调用.
限制可能就是方法(方法名,入参)必须一致吧.
3 建造者模式
模型思路(以装修为例)
装修需要吊顶/刷墙/地板/地砖等.(图中地板地砖只选择了一种,但你可以又铺地板又铺地砖)😂
每一种物料, 都有公有的属性: 包括 价格 品牌 型号 单价 广告词啥的 等等........
然后现在选择一种装修, 就是在每个种类的可选项里面选择一种 来组成一整套的装修方案
例: 我要 一级顶+多乐士油漆+圣像地板+东鹏地砖(甚至我可以再刷一层立邦漆 + 立邦)
完全可以自由组合 代码实现:
总结一下个人心得:
建造者模式的适用性---将零件组合成完整个体, 把个体的属性带入到整体内.
同理想个其它的例子: 比如 卖东西
成本 / 物流 / 仓库 / 溢价 / 广告 / 快递 也可以使用这种方式来设计
还可以把 售价 也放在里面, 直接计算出最终利润, 不同的组合, 不同的快递 通过直观的看到结果金额来决定需要溢价多少, 成本是否需要控制, 是否需要减去其中的某一环节 按照这套流程最后到底赚不赚钱 (简直不要太合适😉)
突然回想起之前做的某个购买功能没有使用这个设计模式, 想回去改一波......
4 原型模式
举例是: 考试试卷 为了防止邻座之间视力偷窥 - - 把题目和答案顺序全部打乱
实现方式: 初始化一套试卷 然后循环做一件事 ( clone-复制一套试卷,然后逻辑代码把顺序打乱,再返回这一套试卷 )
感觉没什么, 就是一个clone 或许道行不够吧....
5 单例模式
全局只需要一个
把构造方法私有化, 然后对外提供一个获取对象的方法
5.1 线程安全的懒汉式 依靠 synchronized 关键字实现 (这个关键字有点东西, 可以追究到AQS ABA下回整理了再发文分析)
5.2 饿汉式(自带线程安全光环, 因为静态直接就构建了)
5.3 使用类的内部类 (还是static)
5.4 双重校验(也叫二重锁) + synchronized
这里有另一个关键字 volatile (解决指令重排的问题, 知识盲区了, 没研究)
5.5 CAS AtomicReference (都CAS+Atomic了, 看名字就感觉线程安全)
跟CAS实现方式之一同理, 靠死循环, 巨耗资源! 不如 synchronized 好使, synchronized 是一个重量级锁, 直接在那等待唤醒就行了
5.6 枚举单例 (线程安全) 额... 这是我做梦都没想到的... 书读少了 是下面这本书 👇
来源: 《Effffective Java》
OK 创建型模式到这里就告一段落了. 明天开始学习7大结构型模式