按一般教程中出现的例子理解:

简单工厂模式:客户端传一个条件进工厂类,工厂类根据条件创建相应的产品类对象,并return给客户端,供客户端使用。即客户端使用的是工厂类生产的产品对象。

策略模式:客户端创建一个Context类对象a(可以看作是工厂模式中工厂类),创建一个策略对象并传参给对象a,然后客户端使用a对象的某些方法来使用前面传参进来的策略,即客户端是通过a对象使用策略的。

简单的说,

1、工厂模式根据条件生产出产品给客户端用。而策略模式是客户端使用传参给Context的策略(你也可以理成产品),传入策略的不同,调用同样方法得到的结果也不同。

2、工厂模式:客户端是使用工厂类生产的对象进行操作,策略模式:客户端使用自己传给Context的策略的对象进行操作。

策略模式定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响到使用算法的客户。需要设计一个接口,为一系列实现类提供统一的方法,多个实现类实现该接口,设计一个抽象类(可有可无,属于辅助类),提供辅助函数,关系图如下:

图中ICalculator提供同意的方法,
AbstractCalculator是辅助类,提供辅助方法,接下来,依次实现下每个类:

首先统一接口:

  1. public interface ICalculator {
  2. public int calculate(String exp);
  3. }

辅助类:

  1. public abstract class AbstractCalculator {
  2. public int[] split(String exp,String opt){
  3. String array[] = exp.split(opt);
  4. int arrayInt[] = new int[2];
  5. arrayInt[0] = Integer.parseInt(array[0]);
  6. arrayInt[1] = Integer.parseInt(array[1]);
  7. return arrayInt;
  8. }
  9. }

三个实现类:

  1. public class Plus extends AbstractCalculator implements ICalculator {
  2. @Override
  3. public int calculate(String exp) {
  4. int arrayInt[] = split(exp,"\\+");
  5. return arrayInt[0]+arrayInt[1];
  6. }
  7. }
  1. public class Minus extends AbstractCalculator implements ICalculator {
  2. @Override
  3. public int calculate(String exp) {
  4. int arrayInt[] = split(exp,"-");
  5. return arrayInt[0]-arrayInt[1];
  6. }
  7. }
  1. public class Multiply extends AbstractCalculator implements ICalculator {
  2. @Override
  3. public int calculate(String exp) {
  4. int arrayInt[] = split(exp,"\\*");
  5. return arrayInt[0]*arrayInt[1];
  6. }
  7. }

简单的测试类:

  1. public class StrategyTest {
  2. public static void main(String[] args) {
  3. String exp = "2+8";
  4. ICalculator cal = new Plus();
  5. int result = cal.calculate(exp);
  6. System.out.println(result);
  7. }
  8. }

输出:10

策略模式的决定权在用户,系统本身提供不同算法的实现,新增或者删除算法,对各种算法做封装。因此,策略模式多用在算法决策系统中,外部用户只需要决定用哪个算法即可。

java策略模式(及与工厂模式的区别)的更多相关文章

  1. Java设计模式(1)工厂模式(Factory模式)

    工厂模式定义:提供创建对象的接口. 为何使用工厂模式 工厂模式是我们最常用的模式了,著名的Jive论坛,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见. 为什么工厂模式是如此常用?因 ...

  2. Java开发中的23中设计模式详解(一)工厂方法模式和抽象工厂模式

    一.设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接 ...

  3. Java设计模式2:简单工厂模式

    简单工厂模式 简单工厂模式是类的创建模式,又叫做静态工厂方法模式.简单工厂模式由一个工厂对象决定生产出哪一种产品类的实例. 为什么要使用简单工厂模式 原因很简单:解耦. A对象如果要调用B对象,最简单 ...

  4. java设计模式案例详解:工厂模式

    1.简单工厂模式 在不考虑扩展的情况下还是很好用的,其实我们写代码也很经常用到,其主要理解在于传入不同参数则构建不同对象,只有一个工厂,如需添加产品涉及到扩展需要修改比较多的东西,不符合开闭原则,如下 ...

  5. Java设计模式之(工厂模式)--简单工厂模式--工厂方法模式--抽象工厂模式

    工厂模式: 工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂方法模式(Factory Method) 3)抽象工厂模式(Abstract Factory) 简单工厂模 ...

  6. Java设计模式之【工厂模式】(简单工厂模式,工厂方法模式,抽象工厂模式)

    Java设计模式之[工厂模式](简单工厂模式,工厂方法模式,抽象工厂模式) 工厂模式出现的原因 在java中,创建一个对象最简单的方法就是使用new关键字.但在一些复杂的业务逻辑中,创建一个对象不只需 ...

  7. Java设计模式学习记录-简单工厂模式、工厂方法模式

    前言 之前介绍了设计模式的原则和分类等概述.今天开启设计模式的学习,首先要介绍的就是工厂模式,在介绍工厂模式前会先介绍一下简单工厂模式,这样由浅入深来介绍. 简单工厂模式 做法:创建一个工厂(方法或类 ...

  8. C++设计模式 ==> 策略模式与简单工厂模式结合

    简介 策略模式相较之于简单工厂模式适用于生产方法经常变化且方法较为繁多的情况,因为生产方法时常变化就会需要频繁修改工厂类,违背了开闭原则,这时就可以用策略选择类由客户端根据需求动态切换策略.且策略模式 ...

  9. 设计模式之策略模式&简单工厂模式

    学习设计模式已经有非常长一段时间了,事实上先前已经敲过一遍了.可是老认为没有学到什么,认识也不够深刻.如今趁着重构机房,再又一次来过,也不晚. 事实上在敲了机房之后,看看模式,事实上,曾经非常难理解. ...

  10. JAVA基础——设计模式之简单工厂模式

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

随机推荐

  1. mysql导出数据库数据及表结构

    1,导出远程数据库数据到本地 mysql -A wj_sms -h192.168.1.105 -uroot -p4321 -ss -e "set NAMES 'utf8';SELECT * ...

  2. Console2支援中文顯示的正式設定法

    1.用regedit找到HKEY_CURRENT_USER\Console,把底下的Console2 command window機碼給砍了.2.Console2的View功能表中,有個Console ...

  3. 6. H.264/AVC编码器原理

    1. H.264/AVC的应用 H.264 不仅具有优异的压缩性能,而且具有良好的网络亲和性,这对实时的视频通信是十分重要的.和 MPEG-4 中的重点是灵活性不同,H.264 着重在压缩的高效率和传 ...

  4. ubuntu10.10手工安装jdk1.6

    声明:以下操作是在root用户下操作. 一.下载JDK首先,在Oracle的官网上下载JDK.http://www.oracle.com/technetwork/java/javase/downloa ...

  5. pyinstaller打包后运行提示找不到模块

    截止到2017年9月20号,pyinstaller只支持到python3.5,如果需要支持到3.6,需要自己在github上下载pyinstaller的开发版. 在打包时候,并没有提示错误,可以顺利打 ...

  6. Scala基础:面向对象之trait

    trait类似于java中的interface,但是有所不同 Scala中的trait是一种特殊的概念: 首先先将trait作为接口使用,此时的trait就与Java中的接口 (interface)非 ...

  7. 使用CMD命令行来对MySQL数据库执行迁移、备份、恢复

    1. 导出数据库数据   "C:\Program Files\MySQL\MySQL Server 5.6\bin\mysqldump.exe" -u root -p123abc ...

  8. 用java实现一个简易编译器

  9. fsync性能问题

    最近在测试种发现程序里调用fsync刷文件到磁盘时,开销只有几百微秒,于是对fsync相关机制进行了一番调查. 磁盘(或RAID卡)自身通常会有硬件缓存机制,对于写操作,有write back和wri ...

  10. ubuntu18 tensorflow cpu fast_rcnn

    (flappbird) luo@luo-All-Series:~/MyFile/TensorflowProject/tf-faster-rcnn/lib$ makepython setup.py bu ...