简单工厂
简单工厂,顾名思义要比其他两个工厂简单一些,工厂的作用可以认为是一个人要一件成品交给工厂去完成,那么这个人只要的是结果,对于内部的细节来说是不关心的,所以我们可以理解为这个人直接跟工厂对接。即:在客户端只跟工厂模块对接。
那工厂接到某人给它的任务就开始工厂自己的工作。那么工厂就会命令下面的部门,我们要完成一项什么样的任务,相关部门进行工作。比如说现在要实现一个计算器的功能,客户只要能得到自己的计算结果就行。那么工厂部门就可以命令自己的“运算”部门去工作。下面这段代码就是工厂下的一个部门的工作。
public class Operation { private double _numberA=0; private double _numberB=0; } public double NumberA { get{return _numberA;} set{_numberA=value;} } public double numberB { get{return _numberA;} set{_numberA=value;} } public virtual double GetResult() //虚方法 { double result=0; `return result; }
然后“运算部门”告诉自己下面的工人去制作应该要完成的工作。下面的代码就是工人要做的事情。
class OperationAdd:operation { pubic override double GetResult { double result=0; result =NumberA+NumberB; return result; } } class OperationSub:operation { public override double GetResult() { double result=0; result=NumberA-NumberB; return result; } } class OperationMul:Operation { public override double GetResult () { double result =0; result=NumberA*NumberB; return result; } } class OperationDiv:Ooperation { public override double GetResult() { double result =0; if(Number=0) throw new Exception("除数不能为0"); result=NumberA/NumberB; return result; } }
每个工人把自己的工作做好之后,把成果给工厂
public class OperationFactory//建造一个工厂类 { public static Operation createOperate(string operate) { operation oper=null; switch (operate) { case"+":oper=new OperationAdd();break; case"-":oper=new OperaionSub();break; case"*":oper=new OperationMul();break; case"/":oper=new OperationDiv();break; } return oper; } }
工厂把最后的成果给客户,并且客户可以得到自己想要的东西
Operation oper; oper=OperationFactory.createOperate"+"; oper.NumberA=1; oper.numberB=2; double result =oper.GetResult();
工厂模式
工厂模式很好理解,如果想要增加新的功能,往工厂类中加case语句即可,这样增加了新的功能,但是同时又修改了原理来的类,这就违背了开闭原则。 那么如何解决这一问题呢?就需要利用到工厂模式了。这个计算器中的工厂类可以抽象出来一个工厂接口,把下面的各个运算方式改为各个运算工厂,这样如果我们要增加类的话,就不会违背开闭原则。
优点:它们是松耦合的,因为创建对象的代码与使用它的代码是分开的。客户端完全不需要关心要传递哪些参数以及需要实例化哪些类。由于添加新类更加容易,所以降低了维护成本。
工厂方法用于创建一个产品
构建工厂接口
interface IFactory { Operation CreateOperation(); }
然后再用工厂下面的各个运算类型(加减乘除)去实现这个接口。
class AddFactory:IFactory { public Operation CreateOperation() { return new OperationAdd(); } } class SubFactory:IFactory { public Operation CreateOperation() { return new OperationSub(); } } class MulFactory:IFactory { return new OperationMul(); } class DivFactory:IFactory { return new OperationDiv(); }
客户端
IFactory operFactory =new AddFactory (); Operation oper=operFactory .CreateOperation() oper.NumberA=1; oper.NumberB=2; double result=oper.GetResult();
抽象工厂
抽象工厂方法用于创建相关产品的系列,我觉得跟工厂模式有相似之处,如果有新的接口,在工厂接口中增加新的接口方法。
对抽象工厂还有不明白的部分,欢迎各位成功人士留下你们精彩的评论!