直接上代码:
简单工厂模式:
------------------------------1个抽象类 --------------------------
abstract class AbsClass { //抽象方法:提供一些列的算法操作 public abstract void acceptCash(string org); }
------------------------------2个实现类 --------------------------
//继承自抽象类 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 static AbsClass createCashAccept(stringtype) { AbsClass cs = null; switch (type) { case "A": cs = new Al(); break; case "B": cs = new B(); break; case "...": ........ .... break; } return cs; } }
客户端调用:
/利用简单工厂模式根据下拉选择框,生成相应的对象
AbsClass csuper = CashFactory.createCashAccept("A");// 通过传入type 就可以得到具体的实现类,就好比:你去机场,你直接跟你秘书说,我们开车去机场,这个时候你秘书开车载我去,你负责坐车到机场就可以了。
AbsClass csuper= CashFactory.createCashAccept("B"); //或者 秘书去叫出租车 我们打车去
策略模式
前面的类没有任何变化,只是把CashFactory变成了CaseContext策略类
//策略Context class CashContext { //声明一个现金收费父类对象 private AbsClass cs; //设置策略行为,参数为具体的现金收费子类(正常,打折或返利) public CashContext(AbsClass csuper) { this.cs = csuper; } //得到现金促销计算结果(利用了多态机制,不同的策略行为导致不同的结果) public double GetResult(double money) { return cs.acceptCash(money); } }
客户端调用:
AbsClass cc = 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类,没有创建具体的对象,实现的代码的进一步封装,客户端代码并不需要知道具体的实现过程。
当然用的最多的还是两者的结合使用。
总结:简单工厂模式:只需要发出命令,由他人去实现,策略模式:不仅仅要发出命令,还得由自己亲自去做。