设计模式之策略模式&简单工厂模式
学习设计模式已经有非常长一段时间了,事实上先前已经敲过一遍了。可是老认为没有学到什么,认识也不够深刻。如今趁着重构机房,再又一次来过,也不晚。
事实上在敲了机房之后,看看模式,事实上,曾经非常难理解。非常难看懂的代码一眼就能够看懂了,趁着有点感觉了。早点收获吧。
简单工厂模式:
简单地说简单工厂模式:非常easy变化的地方,就能够用到简单工厂模式。
实例:
举个样例:我们在逛商场时。正好商场促销,各种优惠活动:有满300返100 ,有打8折的、抽奖等等吧。
促销来讲,各种优惠活动事实上就是变化。
再举个样例:我们在买早餐的时候。早餐店里琳琅满目,但不管是谁来这家商店买都系,营业员问你须要什么,他就知道给你拿什么东西。我们须要的东西就是变化。
浅谈:
简单工厂模式就是通过传入的数据返回几种可能类宏的一种类的实例。但这几种类通常会有一个共同特点就是:这几种类有一个共同的父类和共同的方法。但每一个方法被容不同。并且依据不同的数据进行优化。
深入:
上述是浅谈,实质:面对这些变化,面向对象的思想就是封装这些变化。封装变化之后,则可添加它的可扩展性,不会再改动曾经的类了。
简单工厂模式结构图:
实现商场促销:
父类:
<span style="background-color: rgb(204, 204, 204);"><strong> abstract class CashSuper//父类。一个抽象还是,封装
{
public abstract double acceptCash(double money);
}</strong></span>
各个子类:
class CashNormal :CashSuper//各个实例化的对象。实现了多态
{
public override double acceptCash(double money)//实现父类中的方法。并各个不同的类之间都有差异
{
return money;
}
}
class CashRebate:CashSuper
{
private double moneyRebate = 1d;
public CashRebate(string moneyRebate)
{
this.moneyRebate = double.Parse(moneyRebate);
}
public override double acceptCash(double money)
{
return money * moneyRebate;
}
}
class CashReturn:CashSuper
{
private double moneyCondition = 0.0d;
private double moneyReturn = 0.0d;
public CashReturn (string moneyCondition,string moneyReturn)
{
this.moneyCondition = double.Parse(moneyCondition);
this.moneyReturn = double.Parse(moneyReturn);
}
public override double acceptCash(double money)
{
double result = money;
if (money >= moneyCondition)
result = money - Math.Floor(money / moneyCondition) * moneyReturn; return result;
} }
工厂模式:
//简单工厂模式
class CashFactory//简单工厂模式实现了。将选择放在了业务层。而不是界面层
{
public static CashSuper createCashAccept(string type)
{
CashSuper cs = null;//定义了一个父类的类型
switch (type)
{
case"正常收费":
cs = new CashNormal();//实例化的是各个子类对象
break;
case"满300返100":
CashReturn cr1 = new CashReturn("300", "100");
break;
case"打8折":
CashRebate cr2 = new CashRebate("0.8");
break;
}
return cs;
}
}
界面层:
private void button1_Click(object sender, EventArgs e)
{
//简单工厂模式-------------------------------------------------------------------
CashSuper csuper = CashFactory.createCashAccept(cbxType.SelectedItem.ToString());//简单工厂模式的写法,client认识两个类,CashSuper和CashFactory。再简单工厂模式中就已经实例出了各个子类对象
double totalPrices = 0d;
totalPrices = csuper.acceptCash(Convert.ToDouble(txtPrice.Text) * Convert.ToDouble(txtNum.Text));
total = total + totalPrices;
lbxList.Items.Add("单位价格" + txtPrice.Text + "数量:" + txtNum.Text + "" + cbxType.SelectedItem + "合计:" + totalPrices.ToString());
label4.Text = total.ToString(); }
我们都知道,商店不是一直都有促销的。也不一定今年这这样的促销。明年还是这样的,事物都是在随着时间变化的。假设每次更改打折额度和返利额度,每次都要维护或扩展收费方式,都要修改工厂。一直代码徐又一次编译部署。这要就非常糟糕了,面对算法的市场变动。就须要策略模式了。
策略模式:
样例:
商店里促销每年须要更改打折额度和返利额度。
结构图:
闲谈:
事实上策略模式定义了算法家族。分别封装起来。让他们之间能够相互取代,此模式让算法的变化,不会影响到使用算法的客户。全部这些算法完毕的都是同样的工作,仅仅是实现不同,他能够用同样的方法调用全部的算法。降低了算法类和使用算法类之间的耦合。
深入:
简单工厂来生成算法对象,算法是随时都可能互相替换,这就是变化点。封装变化点。
实现商店促销:
前面的父类和个促销子类不须要改动:
策略模式代码:
class CashContext//用一个CashContext来配置,维护一个对Strategy对象的引用。
{
CashSuper cs=null;
public CashContext(string 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");
cs=cr2;
break;
}
}
public double GetResult(double money)
{
return cs.acceptCash(money);
}
}
界面代码:
private void button1_Click(object sender, EventArgs e)
{ //策略模式和简单工厂模式结合----------------------------------------------------
CashContext csuper = new CashContext(cbxType.SelectedItem.ToString());//client仅仅认识CashContext即可了,纯如详细的策略对象
double totalprices = 0d;
totalprices = csuper.GetResult(Convert.ToDouble(txtPrice.Text) * Convert.ToDouble(txtNum.Text));
total = total + totalprices;
lbxList.Items.Add("单位价格:" + txtPrice.Text + "数量:" + txtNum.Text + " " + cbxType.SelectedItem + "合计:" + totalprices.ToString());
label4.Text = total.ToString();
}
以上就是策略模式和简单工厂模式的结合了,简单工厂模式事实上说简单一点就是:一个类创造实例的过程。策略模式:策略随时有可能互相替换。
设计模式之策略模式&简单工厂模式的更多相关文章
- C++设计模式 ==> 策略模式与简单工厂模式结合
简介 策略模式相较之于简单工厂模式适用于生产方法经常变化且方法较为繁多的情况,因为生产方法时常变化就会需要频繁修改工厂类,违背了开闭原则,这时就可以用策略选择类由客户端根据需求动态切换策略.且策略模式 ...
- Java 设计模式系列(二)简单工厂模式和工厂方法模式
Java 设计模式系列(二)简单工厂模式和工厂方法模式 实现了创建者和调用者的分离.分为:简单工厂模式.工厂方法模式.抽象工厂模式 简单工厂模式.工厂方法模式都很简单,就不详细介绍了. 一.简单工厂 ...
- 设计模式(Java语言)- 简单工厂模式
简单工厂模式有称为静态工厂模式,属于设计模式中的创建型模式.简单工厂模式通过对外提供一个静态方法来统一为类创建实例.简单工厂模式的目的是实现类与类之间解耦,其次是客户端不需要知道这个对象是如何被穿创建 ...
- Java设计模式之(工厂模式)--简单工厂模式--工厂方法模式--抽象工厂模式
工厂模式: 工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂方法模式(Factory Method) 3)抽象工厂模式(Abstract Factory) 简单工厂模 ...
- 学习设计模式第二十七 - GoF之外简单工厂模式
示例代码来自<深入浅出设计模式>和<大话设计模式> 概述 简单工厂模式又被称为静态工厂模式,属于类的创建型模式.其实质是由一个工厂类根据传入的参量,动态决定应该创建出哪一个产品 ...
- 设计模式(Java版)-创建型模式之简单工厂模式
前言:这段时间在学习设计模式,本人也是小菜一枚(所以写的如果有错误的地方请大大们给予指出).这个东西也是我一直想学习的,从点点滴滴做起,记录下自己每天的领悟! 一.工厂模式的动机 在软件系统中,经常面 ...
- [Python设计模式] 第1章 计算器——简单工厂模式
github地址:https://github.com/cheesezh/python_design_patterns 写在前面的话 """ 读书的时候上过<设计模 ...
- Javascript设计模式理论与实战:简单工厂模式
通常我们创建对象最常规的方法就是使用new关键字调用构造函数,这会导致对象之间的依赖性.工厂模式是一种有助于消除类之间依赖性的设计模式,它使用一个方法来决定要实例化哪一个类.本文详细介绍了简单工厂模式 ...
- Java设计模式(1)——创建型模式之简单工厂模式(Simple Factory)
设计模式系列参考: http://www.cnblogs.com/Coda/p/4279688.html 一.概述 工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高 ...
随机推荐
- 使用docker api
前提: 系统centos 7 docker version 1.10.3 使用systemd启动docker 访问方式: 修改/usr/lib/systemd/system/docker.servic ...
- 解决工作中遇到的一个"打开,保存"文件框的bug的过程
工作中遇到的这个问题还是很有意思的.其中嵌套了很多奇葩性的问题. (转载请指明出于breaksoftware的csdn博客) 我们来看下故事的发生过程,QA同学发现我们存在如下的bug 看到如此多的串 ...
- VCAP5-DCA – What’s new?
see also: 韩国人的教材:http://ddii.pe.kr/ Section 1.1 – Implement and Manage complex storage Determine use ...
- 神器phpstorm功能具体解释
phpstorm包括了webstorm的所有功能,更可以支持php代码. PhpStorm是一个轻量级且便捷的PHP IDE,其旨在提供用户效率,可深刻理解用户的编码,提供智能代码补全,高速导航以及即 ...
- python binascii模块详解
['Error', 'Incomplete', 'b2a_hex', 'hexlify' #Hexadecimal representation of binary data. 字符串转16进制'a2 ...
- APP注册邀请码
小火箭:MrZOpba685OMLSpanBKFtkxcQf5eGOY 文章来源:刘俊涛的博客 欢迎关注,有问题一起学习欢迎留言.评论
- vim自动保存折叠
我经常使用的是手工折叠方式,就是 :set foldmethod=manual vim常用的折叠命令有: zf:折叠选定的行 zo:打开折叠 zR:打开所有折叠 zM:关闭所有折叠 zd:删除折叠 我 ...
- window搭建python环境
在window开发python代码,搭建python环境! 01.下载python-win https://www.python.org/downloads/windows/ http://ipyth ...
- 移植到windows下的iconv
This is a short memo about installing iconv on Windows host (specifically: Windows 7 SP1 x64). Iconv ...
- Linux中svn的使用
1. 安装Linux 执行如下命令,中间会出现一次提示,选y即可 yum install subversion 2. 创建资源库位置 svnadmin create /usr/java/testJen ...