最近一直在抽时间研究设计模式,之前对设计模式也有一定的了解,但是都没有平心静气的去研究过,只是了解了一些皮毛,最近打算再深入研究一下,重新打开了设计模式的数据,对之前的疑问一个个的刨根问底,今天看了简单工厂模式和策略模式看的人有点小晕,两个的大概思路没有怎么变,都是通过多态去减少代码的耦合度,怎么看两个都是如出一辙,最后终于找到了两个的本质区别,在此和大家分享下:
先上代码:
简单工厂模式:
//抽象类
abstract class AbsClass
{
//抽象方法:提供一些列的算法操作
public abstractvoid acceptCash(string org);
}
//继承自抽象类
class A:AbsClass
{
//具体方法:提供一些列的算法操作
public override double acceptCash(string org)
{
Console.WriterLine("A类方法");
}
}
//继承自抽象类
class B:AbsClass
{
//具体方法:提供一些列的算法操作
public override double acceptCash(string org)
{
Console.WriterLine("B类方法");
}
}
... .... ....
简单工厂类
//现金收取工厂
class CashFactory
{
//根据条件返回相应的对象
public staticAbsClass createCashAccept(string type)
{
AbsClass cs = null;
switch (type)
{
case "A":
cs = new Al();
break;
case "B":
cs = new B();
break;
case "...":
........ ....
break;
}
return cs;
}
}
客户端调用:
/利用简单工厂模式根据下拉选择框,生成相应的对象
AbsClasscsuper = CashFactory.createCashAccept("A");
策略模式:
前面的类没有任何变化,只是把Factory变成了CaseContext策略类
//策略Context
class CashContext
{
//声明一个现金收费父类对象
privateAbsClass cs;
//设置策略行为,参数为具体的现金收费子类(正常,打折或返利)
public CashContext(AbsClass csuper)
{
this.cs = csuper;
}
//得到现金促销计算结果(利用了多态机制,不同的策略行为导致不同的结果)
public double GetResult(double money)
{
return cs.acceptCash(money);
}
}
客户端调用:
AbsClasscc = null;
switch (cbxType.SelectedItem.ToString())
{
case "A":
cc = new CashContext(new A());
break;
case "B":
cc = new CashContext(new B());
break;
case "...":
... ....
break;
}
最后概括总结一下:
策略模式和简单工厂模式看起来非常相似,都是通过多态来实现不同子类的选取,这种思想应该是从程序的整体来看得出的。如果从使用这两种模式的角度来看的话,我们会发现在简单工厂模式中我们只需要传递相应的条件就能得到想要的一个对象,然后通过这个对象实现算法的操作。而策略模式,使用时必须首先创建一个想使用的类对象,然后将该对象最为参数传递进去,通过该对象调用不同的算法。在简单工厂模式中实现了通过条件选取一个类去实例化对象,策略模式则将选取相应对象的工作交给模式的使用者,它本身不去做选取工作。
结合上面的代码和下面的释义不难看出,其实两个的差别很微妙,Factory是直接创建具体的对象并用该对象去执行相应的动作,而Context将这个操作给了Context类,没有创建具体的对象,实现的代码的进一步封装,客户端代码并不需要知道具体的实现过程。
今天已经晚了就写到这,感谢你对Darren作品的支持。如果有什么不懂的可以提问。
分享到:
相关推荐
深入浅出设计模式之抽象工厂模式+工厂方法模式+策略模式实现手机加工厂(加类图)
详细解释工厂模式和策略模式,是一个完整的项目(源码)
策略模式(Strategy) 它定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。
NULL 博文链接:https://xiaqi-2009.iteye.com/blog/1041277
简单工厂模式-策略模式-反射源码下载
设计模式之禅之 工厂方法模式+策略模式 设计模式之禅之 工厂方法模式+策略模式
深入浅出设计模式之抽象工厂模式+工厂方法模式+策略模式实现手机加工厂
PHP设计模式实例之(观察者模式、策略模式、简单工厂模式)借鉴.pdf
NULL 博文链接:https://gaojiewyh.iteye.com/blog/430429
设计模式中的策略模式,同时兼容简单工厂模式,商场收银模式,易懂可用。
处理层的设计采用了设计模式中的策略模式、模板方法模式和工厂模式。 Server端和Client端的实现也采用了分层的设计方式,包含自定义的模型层、视图层和控制层。 说明:程序采用配置文件的方式进行初始化,运行时时请...
策略模式,工厂方法模式,观察者模式 例子学习资料,初学者适用
利用策略模式和简单工厂模式,实现商场收银软件。 营业员根据所购买商品的单价和数量,向客户收费 软件功能包括: 1、正常收费 2、打折收费(1折、5折、9折)
策略模式和工厂模式很像。 工厂模式:着眼于得到对象,并操作对象。 策略模式:着重得到对象某方法的运行结果。 示例: //实现一个简单的计算器 interface MathOp{ public function calculation($num1,$num2); } /...
设计模式(策略与简单工厂结合_排序)手写代码,自己博客用
后端同学在开发过程中,势必会遇到多条件判断的情况,大部分时候都会直接采用if-else的形式去处理,这样的操作会存在不易扩展的问题,那么...对比枚举策略与简单工厂+策略模式的不同使用,抛砖引玉,引发你更多的思考
简单工厂模式的C语言实现。改写自http://blog.csdn.net/sx_wpc/article/details/7645062一文的代码。
生日蛋糕订购系统java编写结合装饰者模式工厂模式和策略模式对蛋糕进行打折
抽象工厂模式、建造模式、工厂方法模式、原型模式、单例模式、外观模式、适配器模式、桥接模式、组合模式、装饰模式、享元模式、代理模式、命令模式、解释器模式、访问者模式、迭代子模式、中介者模式、备忘录模式、...
设计模式:简单工厂、方法工厂、抽象工厂、单例、原型、委派、模板、代理、策略