设计模式第一篇-5大创建型模式

441 阅读5分钟
  • 设计模式是⼀整套的思想,在不同的场景合理的运⽤可以提升整体的架构的质量。永远不要想着去硬凑设计模式,否则将会引起过渡设计,以及在承接业务反复变化的需求时造成浪费的开发和维护成本。
  • 初期是代码的优化,中期是设计模式的使⽤,后期是把控全局服务的搭建。不断的加强⾃⼰对全局能⼒的把控,也加深⾃⼰对细节的处理。可上可下才是⼀个程序员最佳处理⽅式,选取做合适的才是最好的选择。

最近找了一个设计模式的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大结构型模式