1.简单工厂模式

  用一个单独的类来做创造实例的过程。

  public class OperationFactory{

    public static Operation createOperate(string operate){

      Operation oper=null;

      switch (operate){

        case “+”:

          oper=new OperationAdd();break;

        case “-”:

          oper=new OperationSub();break;

      case "*":

        oper=new OperationMul();break;

        case "/":

          oper=new OperationDiv();break;

      }

      return oper;

    }

  }

2.策略模式    

  策略模式定义了算法家族。分别封装起来,让它们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户。

  算法本身只是一种策略,最重要的是这些算法是随时都可能互相替换的,这就是变化点,而封装变化点是面向对象的一种很重要的思维方式。

(1)策略与工厂模式结合到一起

  //维护一个策略对象的引用

  class CashContext{

    CashSuper cs=null;

    public CashContext(string type){           //type参数是一个字符串而不是具体的收费策略对象,表示收费类型

      switch (type){

        case "正常收费":

          CashNormal cs0=new CashNormal();

          cs=cs0;

          break;

        case "满300 返100":

          CashReturn cr1=new CashReturn("300","100");

          cs=cr1;

          break;

        case "打8折":

          CashRebate cr2=new CashRebate("0.8");       //实例化具体策略的过程由客户端转移到Context类中。

          cs=cr2;

          break;  

      }

    }

    public double GetResult(double money){

      return cs.acceptCash(money);

    }

    public double GetResult(double money){

      return cs.acceptCash(money);

    }

  }

//客户端代码

  double total=0.0d;

  private void btn_Click(object sender,EventArgs e){

    CashContext csuper=new CashContext(cbxType.SelectedItem.ToString());

    double totalPrices=0d;

    totalPrices=csuper.GetResult(Convert.ToDouble(txtPrice.Text)*Convert.ToDouble(txtNum.Text));

    total+=totalPrices;

    lbxList.Items.Add("单价"+txtPrices.text+"数量:"+txtNum.Text+" "+cbxType.SelectedItem+" 合计:"+totalPrices.ToString());

  }

//简单工厂模式的写法

  CashSuper csuper=CashFactory.createCashAccept(cbxType.SelectedItem.ToString());

  ...=csuper.GetResult(...);

//简单工厂和策略模式结合到一起

  CashContext csuper=new CashContext(cbxType.SelectedItem.ToString());

  ...=csuper.GetResult(...);

  简单工厂模式需要认识两个类,CashSuper和CashFactory,而策略模式与简单工厂结合后,客户端就只需要知道一个类 CashContext类就可以了。耦合更低。我们在客户端实例化的是CashContext的对象,调用的是CashContext的方法 GetResult方法,这使得具体的收费算法彻底地与客户端分离。连算法的父类CashSuper都不让客户端认识了。

转载于:https://www.cnblogs.com/xiaobang/archive/2013/05/29/3105637.html

设计模式 学习笔记(1)简单工厂模式、策略模式相关推荐

  1. 设计模式学习笔记——03 简单工厂 工厂方法 抽象工厂

    简单工厂 简单工厂模式也成静态工厂模式,但此模式不符合开闭原则,但仍然很常用 适用范围:工厂类需要创建的对象种类比较少,客户端只需要知道传入工厂类的参数,对于如何创建对象(逻辑)不关心 上段代码: p ...

  2. 大化设计模式学习笔记(简单工厂模式)

    实质:生产具有相同逻辑的构造器类,也就是由一个工厂对象决定创建出哪一种产品类的实例 案例:计算器 demo见https://github.com/mrjdrs/sign-model.git

  3. 设计模式学习笔记(十七)——Command命令模式

    设计模式学习笔记(十七)--Command命令模式 Command命令模式介绍: Command命令模式是一种对象行为型模式,它主要解决的问题是:在软件构建过程中,"行为请求者"与 ...

  4. 设计模式学习笔记——责任链(Chain of Responsibility)模式

    设计模式学习笔记--责任链(Chain of Responsibility)模式 @(设计模式)[设计模式, 责任链模式, chain of responsibility] 设计模式学习笔记责任链Ch ...

  5. 设计模式学习(四):Strategy策略模式

    一.什么是Strategy模式 Strategy的意思是"策略",指的是与敌军对垒时行军作战的方法.在编程中,我们可以将它理解为"算法".无论什么程序,其目的都 ...

  6. java/android 设计模式学习笔记(7)---装饰者模式

    这篇将会介绍装饰者模式(Decorator Pattern),装饰者模式也称为包装模式(Wrapper Pattern),结构型模式之一,其使用一种对客户端透明的方式来动态的扩展对象的功能,同时它也是 ...

  7. Head First设计模式读书笔记四 简单工厂 工厂模式 抽象工厂模式

    本文示例代码材料源自Head First设计模式 以前整理自己整理的链接: 工厂模式 https://blog.csdn.net/u011109881/article/details/56541580 ...

  8. 设计模式学习笔记(一)之工厂模式、单例模式

    一.工厂模式 (1)简单工厂模式: 1 public interface IProduct { 2 3 public void saleProduct(); 4 5 } 创建一个产品接口,有一个卖产品 ...

  9. CSharp设计模式读书笔记(22):策略模式(学习难度:★☆☆☆☆,使用频率:★★★★☆)...

    策略模式(Strategy Pattern):定义一系列算法类,将每一个算法封装起来,并让它们可以相互替换,策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy). 模式角色与结构: ...

  10. 【Design pattern】简单工厂过渡策略模式

    把自己当做小菜来跟学<大话设计模式>,跟着故事的思路来走 简单工厂模式:实现一个计算器代码 策略模式:商场打折代码 根据大鸟和小菜的故事,一步步的完善问题的过程!

最新文章

  1. 【LeetCode | 二叉树前、中、后序遍历{递归法}实现】
  2. 8idmp导入oracle 11g,11g导入8i的dmp文件问题
  3. html360度视角观赏,360度全景图是如何生成的?
  4. maven 基本命令
  5. 如何评价周志华深度森林模型
  6. Python day17 模块介绍1(time,random)
  7. 混凝土弹性波速计算公式_混凝土强度与应力波速相关性研究
  8. Hierachy Viewer无法在真机上使用的解决方法
  9. 如何将你的微信头像透明化
  10. 在图片上添加文字并生成图片
  11. 苹果微信换行怎么打_微信两根毛表情怎么打出来?左右小辫子符号苹果安卓手机教程介绍...
  12. 云计算、大数据、人工智能傻傻分不清楚?本文详解这三者的关系
  13. liunx查看ftp服务器文件目录,linux查看ftp服务器目录
  14. 对外承包工程有哪些条件_哪些企业可以申请办理对外承包工程经营资格
  15. 华为运营商级路由器配置示例 | EVdPdNd VPLS over SRv6 BE(CE双归接入)
  16. 智慧城市之城市应急智慧系统
  17. 入门智能车 | 带你认识PID闭环控制 - 增量式PID实现电机速度闭环
  18. 如何解决资源管理器被结束任务后的问题,怎么重启或新建资源管理器任务?
  19. Android apk 逆向工程研究﹣破解 MyTV HD 機種限制手記
  20. Real-Time Rendering 4th 译文《一》

热门文章

  1. 做了6年的Java,java视频教程传智播客
  2. 【微信小程序企业级开发教程】订阅消息功能
  3. python【蓝桥杯vip练习题库】ALGO-236大小写转换
  4. python【Matlibplot绘图库】-认识Matploblib
  5. 基础练习 FJ的字符串
  6. ftp服务器文件备份,数据备份是十分重要的,下面是通过ftp将本机数据备份到远程服务器的一个例子...
  7. centos 6.5手动同步ntp时钟_如何安装和配置 Chrony 作为 NTP 客户端? | Linux 中国
  8. PHP文件在线检测病毒,VIRSCAN 在线病毒检测客户端
  9. 湖南网络推广中网络SEO竞争越来越激烈,怎么才能实现“弯道超车”呢?
  10. 网络推广外包专员浅析网络推广外包中网站转化率的发展意义