目录

  • 一、简单工厂模式
  • 二、策略模式
  • 三、简单工厂和策略模式的相同和不同点
  • 四、SpringBoot中用简单工厂搭配策略模式

一、简单工厂模式

概述:定义一个工厂类,它可以根据参数的不同返回不同的实例
类型:创建型-----通俗理解就是创建出一个对象的类型,该类型一定会创建出对象的
注意点:被创建的实例通常都具有共同的父类
做法:
【1】定义一个抽象的对象
【2】定义抽象对象的具体实现子类
【3】定义一个创建对象的工厂

【1】定义一个抽象的对象
//汽车:抽象产品
public abstract class Car {public String getCarName();
}【2】定义抽象对象的具体实现子类
//奔驰:具体产品
public class BenCar extends Car {public String getCarName() {return "奔驰";}
}
//宝马:具体产品
public class BaoCar extends Car {public String getCarName() {return "宝马";}
}【3】定义一个创建对象的工厂
public class CarFactory {// 入参的设计,可以搭配枚举来实现,会更加符合代码规范和业务理解public static Car getCar(String name) {if (object.equals("bao", name) {return new BaoCar();}if (object.equals("ben", name) {return new BenCar();}return null;}
}【使用】
class Client {public static void main(String args[]) {// 重点(目的是为了获取一个对象,使用父类进行承接)Car car = CarFactory.getCar("bao");car.getCarName();Car car = CarFactory.getCar("ben");car.getCarName();}
}

个人的一些理解:
【1】简单工厂模式,就如名字一样,只是一个工厂,用来生产一些东西的,至于拿到了这些东西要干什么,工厂就不管了,它只管生产东西(如:刀具厂,它负责生产它能生产的刀,至于拿到刀的人是切菜还是砍骨头,它就不管了)
【2】这些带工厂两字的工厂模式,感觉更多可能是强调子类实现父类这一思想,然后在获取结果的时候,使用父类来进行承接,也就是会出现向上转型,由于所有的子类都可以转成父类,因此使用的时候只需用父类就可以了,从而达到灵活使用;至于怎么去获取结果,方式可能有多种(如,上面那种简单的,在springboot项目中搭配依赖注入来实现注入到一个map中,然后再根据入参来获取、传入class使用反射来创建等等)
【3】这种工厂类型的模式,看着很简单,可能会觉得没有什么用,但是这具体还是要看业务呀,有用没用要看业务场景的(如:如果获取对象的参数由调用方可理解为前端传的话,那么这种方式就感觉很合适了,无论什么参数,拿到的对象都向上转型,直接使用父类进行调用了)
优点和缺点:
【1】优点是能够灵活使用,方便扩展
【2】缺点嘛会造成很多子类,但是一定程度上可以忽略这个

二、策略模式

定义:定义一系列的算法,将每一种算法封装起来并可以相互替换使用,策略模式让算法独立于使用它的客户应用而独立变化
通俗理解:
【1】定义一系列算法就是有多种处理方式多种解决方案的意思,先把不同的解决方法实现,然后根据具体的情况选用不同的解决方法
【2】策略就是方法,办法,方针,计谋差不多的意思,策略模式就如把三十六计汇聚成一本书,一块研究管理,不然的话如此多的策略,打起仗来临时抱佛脚也不知道该去哪里抱啊
【3】策略模式就是把策略归置好,并且通过一个集中的环境去读取后使用。例如三十六计,就是把三十六中计谋集中归置到书本(集中的环境)中,代后人调阅,也不用管后人到底是古代人,还是现代人,还是中国人,还是外国人
行为型模式:类和对象如何交互,及划分责任和算法
注意点:一系列的具体算法通常都具有共同的父类,利用父类达到灵活调用
做法:
【1】定义一个抽象策略接口
【2】实现抽象策略接口来定义具体的策略
【3】定义一个执行者即上下文Context

【1】定义一个抽象策略接口
public interface IEncryptStrategy {/*** 对一个数字进行加密*/public double encrypt(double input);
}【2】实现抽象策略接口来定义具体的策略
public class AddEncryptStrategy implements IEncryptStrategy {/*** 将原来的值先+1,再加3,再+2,如此复杂的加密算法,一般人想不到哈*/@Overridepublic double encrypt(double input) {return input + 1 + 3 + 2;}
}
public class MultiplyEncryptStrategy implements IEncryptStrategy {/*** 乘法加密——为高端加密算法代言*/@Overridepublic double encrypt(double input) {return input * 10;}
}【3】定义一个执行者(上下文环境)
public class EncryptContext {/*** 可保存任意策略*/private IEncryptStrategy strategy;public EncryptContext(IEncryptStrategy strategy) {this.strategy = strategy;}/*** 调用保存的策略*/public double encrypt(double input) {return strategy.encrypt(input);}
}【使用】
/*** 常规调用实例*/
public class NormalUseStrategy {public static void main(String[] args) {EncryptContext context = new EncryptContext(new AddEncryptStrategy());System.out.println("加法策略:" + context.encrypt(1));context = new EncryptContext(new MultiplyEncryptStrategy());System.out.println("乘法策略:" + context.encrypt(1));}
}

个人理解:感觉策略模式更多的是倾向于行为或方法的多样性,感觉强调的是某种行为或方法的多种形式;在业务上,如果某种行为出现多样性的时候,我觉得就可以使用策略模式了(比如买车这个行为,可以买奔驰、买宝马、买保时捷;无论买啥,最后抽象说法买的就是车);一定一定要注意,是一种行为,有多样性的时候

三、简单工厂和策略模式的相同和不同点

相同点:
【1】代码实现方式很相似,都是子类实现父类,使用父类来达到灵活使用
【2】思想基本一样,都是子类实现父类这种多实现思想

不同点:
【1】注重点不同,工厂模式注重获取对象,而策略模式注重的是获取对象的行为,调用对象的行为,后者比较关注实现细节
【2】两者的使用场景关注点不太一样,工厂模式是关注对象的创建,而策略模式,关注的是行为的多样性

一些理解:
【1】我们去了一个咖啡厅,想喝一杯咖啡,
策略模式的咖啡厅会说:想喝卡布奇诺还是拿铁,自己调好咖啡和奶的比例拿给他,他帮你在咖啡机上磨好装杯子里给你
工厂模式的咖啡厅会说:跟他说要卡布奇诺还是拿铁就行,你不需要关心咖啡豆的比例和制作过程,他帮你做好装杯子里给你
【2】工厂相当于黑盒子,策略相当于白盒子

四、SpringBoot中用简单工厂搭配策略模式

做法:
【1】定义一个抽策略接口
【2】实现抽象策略接口来定义具体的策略
【3】定义一个执行者即上下文Context(这里用法会不同)
【4】在Context中注入具体策略到Map中即把所有策略存储到Context
【5】使用的时候,传入对应策略的key和数据即可

【1】定义一个抽象策略接口
public interface IEncryptStrategy {/*** 对一个数字进行加密*/public double encrypt(double input);// 唯一标识public String getUniqueSign();
}【2】实现抽象策略接口来定义具体的策略
public class AddEncryptStrategy implements IEncryptStrategy {/*** 将原来的值先+1,再加3,再+2,如此复杂的加密算法,一般人想不到哈*/@Overridepublic double encrypt(double input) {return input + 1 + 3 + 2;}// 唯一标识@Overridepublic String getUniqueSign() {return "add";}
}
public class MultiplyEncryptStrategy implements IEncryptStrategy {/*** 乘法加密——为高端加密算法代言*/@Overridepublic double encrypt(double input) {return input * 10;}// 唯一标识@Overridepublic String getUniqueSign() {return "multiplication";}
}【3】定义一个执行者即上下文Context
public class EncryptContext {/*** 可保存任意策略*/private Map<String, IEncryptStrategy> strategyMap = new HashMap<>();@PostConstructpublic void init() {Map<String, IEncryptStrategy> beanMap = applicationContext.getBeansOfType(IEncryptStrategy.class);beanMap.values().forEach(strategy -> strategyMap.put(strategy.getUniqueSign(), strategy));}/*** 调用策略*/public double encrypt(double input, String uniqueSign) {IEncryptStrategy strategy = strategyMap.get(uniqueSign);return strategy.encrypt(input);}
}【使用】
public class NormalUseStrategy {public static void main(String[] args) {EncryptContext context = new EncryptContext();System.out.println("加法策略:" + context.encrypt(1, "add"));System.out.println("乘法策略:" + context.encrypt(1, "multiplication"));}
}

设计模式之简单工厂模式与策略模式相关推荐

  1. android工厂模式和策略模式,android 源码设计模式读书笔记(四)工厂模式和策略模式...

    把这两个一起写 因为他们两个UML的代码接口非常的相似 工厂模式代码结构图 image.png 策略模式UML image.png 在我们看完结构图后 感觉位移不同的就是Factory个Context ...

  2. 设计模式(1)--简单工厂模式、策略模式

    设计模式(1)--简单工厂模式.策略模式 1. 简单工厂模式 在阎宏博士的<JAVA与模式>一书中开头是这样描述简单工厂模式的:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static ...

  3. 大话设计模式1 简单工厂模式 策略模式

    终于得空,本来想看看android的源码,但是想起以前看源码时总有点晕,不清楚为什么要这样设计代码结构,所以决定先把设计模式的相关知识学习一下. 买了n久的大话设计模式啊..终于下定决心开始啃了... ...

  4. 【设计模式2_工厂模式、策略模式】

    工厂模式 工厂模式与策略模式通常可以配合使用,成对出现,也是初学设计模式时常常分不清二者区别的原因. 简单工厂 业务场景需要根据传入的不同参数以获取对应的对象来处理各自的逻辑,很容易写出如下代码: v ...

  5. 设计模式学习笔记(二)工厂模式、模板模式和策略模式的混合使用

    一.工厂模式(Factory pattern) 工厂模式又叫做工厂方法模式,是一种创建型设计模式,一般是在父类中提供一个创建对象的方法,允许子类决定实例化对象的类型. 1.1 工厂模式介绍 工厂模式是 ...

  6. Java设计模式(方法工厂类、单例模式、代理模式、策略模式、适配器、观察者、装饰类等)

    目录 一.简单工厂模式(Factory Method) 二.工厂方法模式 三.抽象工厂模式(Abstract Factory) 3.1 三个工厂模式区别: 四.单例模式(Singleton) 1.饿汉 ...

  7. 拿捏大厂面试,设计模式学习笔记(二)工厂模式、模板模式和策略模式的混合使用

    一.工厂模式 工厂模式又叫做工厂方法模式,是一种创建型设计模式,一般是在父类中提供一个创建对象的方法,允许子类决定实例化对象的类型. 1.1 工厂模式介绍 工厂模式是Java 中比较常见的一种设计模式 ...

  8. 策略模式和工厂模式的区别_java设计模式之状态模式,策略模式孪生兄弟

    状态模式 状态模式(State Pattern)中,类的行为是基于它的状态改变的,状态之间的切换,在状态A执行完毕后自己控制状态指向状态B,状态模式是不停的切换状态执行.这种类型的设计模式属于行为型模 ...

  9. php的类图怎么生成_PHP设计模式之简单工厂模式

    PHP设计模式之简单工厂模式 先从简单工厂入门,不管是面试还是被他人面试,在问到设计模式的时候,大多数人都会提到工厂模式.毫无疑问,工厂相关的几种模式在设计模式中是最出名的也是应用比较广泛的一种模式. ...

  10. C#设计模式(2)——简单工厂模式

    一.引言 这个系列也是自己对设计模式的一些学习笔记,希望对一些初学设计模式的人有所帮助的,在上一个专题中介绍了单例模式,在这个专题中继续为大家介绍一个比较容易理解的模式--简单工厂模式. 二.简单工厂 ...

最新文章

  1. Elasticsearch5.3.1+Kibana5.3.1从单机到分布式的安装与使用1
  2. css 行内元素设置宽高
  3. C++counting sort计数排序(针对string)的实现算法(附完整源码)
  4. 第30天:项目时间管理相关错题整理
  5. 第二十四天 多维数组
  6. 微课|玩转Python轻松过二级(2.1.3节):字符串与字节串简介
  7. 矛与盾——扫描器盲打对主动安全防护的启示
  8. FreeMarker 日期转换
  9. linux权限bcd码是6,Linux权限管理(1)基本权限
  10. Golang 的类型与零值
  11. Windows Store App 音频和视频
  12. SVN客户端和中文包的安装
  13. mysql基础-基本的命令行操作
  14. 出行即服务(MAAS)框架
  15. 2021-2027全球与中国硅胶注塑机市场现状及未来发展趋势
  16. 电阻电路的等效变化(Ⅰ)
  17. 美国互联网影视业的盈利模式
  18. 《30天自制操作系统》---第一天
  19. uname -a命令
  20. CATALINA_OPTS和 JAVA_OPTS区别

热门文章

  1. 产品经理小技术:图片素材随手找,原型设计快又好
  2. 四均线交易系统(Four Set of MA Crossover System)
  3. mac删除分区并合并分区
  4. 《中台产品经理宝典》读后感11:大白话说透时下备受追捧的数字化转型是什么?
  5. 优化electron客户端卡顿的几种方案
  6. 如何教会爸妈用智能手机?方法比耐心重要,get这份手绘板说明书!
  7. 免费的PHP在线解密工具源码
  8. i.MX6ULL GPIO
  9. 查询分析器默认代码颜色
  10. num_workers