最近一直在抽时间研究设计模式,之前对设计模式也有一定的了解,但是都没有平心静气的去研究过,只是了解了一些皮毛,最近打算再深入研究一下,重新打开了设计模式的数据,对之前的疑问一个个的刨根问底,今天看了简单工厂模式和策略模式看的人有点小晕,两个的大概思路没有怎么变,都是通过多态去减少代码的耦合度,怎么看两个都是如出一辙,最后终于找到了两个的本质区别,在此和大家分享下:
先上代码:
简单工厂模式:
//抽象类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策略类
//策略Contextclass 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; }
最后概括总结一下:
漫过心际的孤独,早已蔚然成冰,而你是这个季节里最美的音符。