From 903b2f1c184c174d95e10f4bc99a2dc781579e1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=A6=E8=8B=B1=E6=9D=B0?= <327782001@qq.com> Date: Sat, 29 Jul 2023 18:25:38 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E4=BB=A3=E7=A0=81=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=B3=A8=E9=87=8A=20=E4=B8=8E=20=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/pay/facade/StrategyFacade.java | 37 +++++++++++++------ .../design/pay/factory/StrategyFactory.java | 5 ++- 2 files changed, 29 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/study/design/pay/facade/StrategyFacade.java b/src/main/java/com/study/design/pay/facade/StrategyFacade.java index bac4c58..459bcf8 100644 --- a/src/main/java/com/study/design/pay/facade/StrategyFacade.java +++ b/src/main/java/com/study/design/pay/facade/StrategyFacade.java @@ -18,17 +18,24 @@ import com.study.design.pay.factory.StrategyFactory; * @date : 2023/7/29 09:22 */ public class StrategyFacade { - // 定义一个map,将对应关系提前初始化好。 - // 双十一的时候,有大量的用户进行下单(千万级),就会造成千万级的pay接口的调用。 - // 很可惜,这部分代码里边有两个 new 关键字(new PayContext(payStrategy) 和 new AddFuncDecorator)。 - // 如果瞬时见。有几十万的并发进来,那么会创建几十万个 context对象和 addFunc对象,造成 年轻代的eden区的频繁对象创建 - // 虽然说调用完就进行了对象的垃圾收集,但是这么多的访问对象进来会造成,minorgc。 - // 1. 单例模式吗?PayContext创建是基于payStrategy,不止一种paycontext啊,用单例不行呀。 AddFuncDecorator 是基于PayContext - // 创建的,PayContext 不止一种,AddFuncDecorator 也不止一种。 - // 2. 享元模式。享元模式是单例模式的一种思想升级。单例模式,针对的是同一种对象,没有任何不同的细节。而享元模式,针对多个对象。 - // 多个对象:同一种class,但是里边的属性有些许不同。PayContext是同一种对象吧?是的; PayContext 是不是有细节上的不同呢?是的, - // payStrategy不同; 那么我们是否可以知道这个PayContext的种类数量呢?是的,目前有三种。 享元模式能够对这可控数量的有不同细节的 - //同一种class对象进行共享,保证我们的程序不频繁的创建对象。 + + + /** + * 定义一个map,将对应关系提前初始化好。 + * 双十一的时候,有大量的用户进行下单(千万级),就会造成千万级的pay接口的调用。 + * 很可惜,这部分代码里边有两个 new 关键字(new PayContext(payStrategy) 和 new AddFuncDecorator)。 + * 如果瞬时见。有几十万的并发进来,那么会创建几十万个 context对象和 addFunc对象,造成 年轻代的eden区的频繁对象创建 + * 虽然说调用完就进行了对象的垃圾收集,但是这么多的访问对象进来会造成,minorgc。 + * 1. 单例模式吗?PayContext创建是基于payStrategy,不止一种paycontext啊,用单例不行呀。 AddFuncDecorator 是基于PayContext + * 创建的,PayContext 不止一种,AddFuncDecorator 也不止一种。 + * 2. 享元模式。享元模式是单例模式的一种思想升级。单例模式,针对的是同一种对象,没有任何不同的细节。而享元模式,针对多个对象。 + * 多个对象:同一种class,但是里边的属性有些许不同。PayContext是同一种对象吧?是的; PayContext 是不是有细节上的不同呢?是的, + * payStrategy不同; 那么我们是否可以知道这个PayContext的种类数量呢?是的,目前有三种。 享元模式能够对这可控数量的有不同细节的 + * 同一种class对象进行共享,保证我们的程序不频繁的创建对象。 + * + * @param payBody + * @return + */ public static Boolean pay(PayBody payBody) { //获取我们的 策略枚举 StrategyEnum strategyEnum = getStrategyEnum(payBody.getType()); @@ -38,7 +45,7 @@ public class StrategyFacade { //获取我们的策略对象 PayStrategy payStrategy = StrategyFactory.getPayStrategy(strategyEnum); //生成我们的策略上下文 - PayContext context = new PayContext(payStrategy); // TO DO + PayContext context = new PayContext(payStrategy); // 装饰一下 context,。立马多了一个功能 // 我看这行代码啊,就不顺眼。代理模式搞他。 AddFuncDecorator addFuncDecorator = (AddFuncDecorator) AddFuncFactory.getAddFunc(context); @@ -46,6 +53,12 @@ public class StrategyFacade { return addFuncDecorator.execute(payBody); } + /** + * 根据type获取测罗枚举 + * + * @param type + * @return + */ private static StrategyEnum getStrategyEnum(int type) { switch (type) { case 0: diff --git a/src/main/java/com/study/design/pay/factory/StrategyFactory.java b/src/main/java/com/study/design/pay/factory/StrategyFactory.java index 13c7c01..7fea83b 100644 --- a/src/main/java/com/study/design/pay/factory/StrategyFactory.java +++ b/src/main/java/com/study/design/pay/factory/StrategyFactory.java @@ -16,7 +16,10 @@ import java.util.concurrent.ConcurrentHashMap; */ public class StrategyFactory { - //思想升级之后的享元,模式了。 + /** + * 单例模式 + * 思想升级之后的享元,模式了 + */ private static final Map strategyMaps = new ConcurrentHashMap(); -- GitLab