设计模式——工厂方法模式

来源:互联网 发布:阿里云登录界面 编辑:程序博客网 时间:2024/06/05 19:29
转载请注明出处!
工厂方法说明:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。
先来一份工厂方法模式的Template,此Template是与简单工厂模式的例子一样,实现计算器的运算功能( 在此可以先回顾下简单工厂模式的例子):

//运算操作的父类,各种操作运算继承此类 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 _numberB; } set { _numberB = value; } } //获取结果的虚方法,重写 public virtual double GetResult() { return 0; } }

public class OperationAdd : Operation //加法运算

{ public override double GetResult() { return NumberA + NumberB; } }

public class OperationSub : Operation //减法运算 { public override double GetResult() { return NumberA - NumberB; } }

public class OperationMul : Operation //乘法运算 { public override double GetResult() { return NumberA * NumberB; } }

public class OperationDiv : Operation //除法运算 { public override double GetResult() { if (NumberB == 0) Console.WriteLine("除数不能为0!"); return NumberA / NumberB; } }

//具体加法工厂 class AddFactory : IFactory { public Operation CreateOperation() { return new OperationAdd(); } }

//具体减法工厂 class SubFactory : IFactory { public Operation CreateOperation() { return new OperationSub(); } }

//具体乘法工厂 class MulFactory : IFactory { public Operation CreateOperation() { return new OperationMul(); } }

//具体除法工厂 class DivFactory : IFactory { public Operation CreateOperation() { return new OperationDiv(); } }

//客户端代码

class MainProgram { public void Main() { //客户端创建具体的工厂 IFactory factory = new AddFactory(); //调用工厂的接口 Operation operation = factory.CreateOperation(); operation.NumberA = 1; operation.NumberB = 2; double result = operation.GetResult(); Console.ReadKey(); } }

第一篇设计模式介绍过简单工厂模式的使用,在此说明下两种模式的区别所在:简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖,例如设计的计算器程序中,只需要把运算符号(例如“+”)给工厂,工厂自动就给出了相应的实例。但是问题在于,如果添加一种运算(例如“求n次方”),这种运算在简单工厂中不存在,那么就要修改原有的工厂类,增加case分支条件,这不是好办法,违背了开放-封闭原则。所以工厂方法的优点也就体现出来了——工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的,也就是说工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行,如果想要添加功能,现在只需要修改客户端代码即可。
原创粉丝点击