设计模式——简单工厂模式的实现[备忘录]
身为一个小菜鸟,接触一下设计模式。之前听到设计模式,各种神奇,不亚于程序界的“葵花宝典”、“九阴真经”之类。
之所以写下来,如题目所述:【备忘录】,也是督促自己学习的一个过程。
最近慢慢接触后,也发现了它的神奇与巧妙。要学习面向对象,设计模式能改变我们以计算机的思维去让计算机工作的想法,要让计算机以人的思维去工作,展现其灵活与强大。学习设计模式,能深刻的去体会用面向对象的思维去思考事物。
参考:《大话设计模式》---程杰;度娘;谷哥;还有博客园的大牛们。
http://www.cnblogs.com/anlyren/archive/2008/01/31/oo.html
面向对象的好处:利用面向对象的分析编程思想,通过封装、继承、多态把程序的耦合度降低。用设计模式使得程序更加容易修改,并且易于复用。
定义:专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类或接口。简单工厂模式又称为静态工厂方法(Static Factory Method)模式,属于类的创建型模式,通常根据一个条件(参数)来返回不同的类的实例。
自己的理解:创建一个类,接收客户端的不同参数,来实例化不同的类实例。
应用场景:
- 工厂类负责创建的对象比较少
- 客户只知道传入了工厂类的参数,对于始何创建对象(逻辑)不关心
优缺点:
优点:
- 简单工厂模式能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。通过它,外界可以从直接创建具体产品对 象的尴尬局面中摆脱出来。
- 外界与具体类隔离开来,偶合性低。
- 明确区分了各自的职责和权力,有利于整个软件体系结构的优化。
缺点:
- 工厂类集中了所有实例的创建逻辑,容易违反GRASPR的高内聚的责任分配原则
- 虽然简单工厂模式能够适应一定的变化,但是它所能解决的问题是远远有限的。它所能创建的类只能是事先教考虑到的,如果需要添加新的类,则就需要改变工厂类了。(这个问题在工厂模式中将得到很好的解决)
今天的简单工厂简要背景:利用面向对象的思想,模拟简单的计算器程序。
程序设计离不开的UML类图,今天简单工厂模式的UML图:
简单描述:将加、减、乘、除四种方法类抽象出一个共同的“运算类”;
运算类接收两个参数 NumberA、NumberB,并有一个虚方法返回其结果;
加、减、乘、除四种方法类均继承 “运算类”;
构造简单工厂类通过传入“+、-、*、/”来分别实例化加、减、乘、除四种方法类的实例;
上代码:
运算类:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SimpleFactoryPattern { 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() { double result = 0; return result; } } }
加、减、乘、除四种方法类及构造的简单工厂类(省力写一块去了):
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SimpleFactoryPattern { class OperationBLL { } /// <summary> /// 加法 /// </summary> internal class OperationAdd:Operation { public override double GetResult() { double result = 0; result = NumberA + NumberB; return result; } } /// <summary> /// 减法 /// </summary> internal class OperationSub:Operation { public override double GetResult() { double result = 0; result = NumberA - NumberB; return result; } } /// <summary> /// 乘法 /// </summary> internal class OperationMul:Operation { public override double GetResult() { double result = 0; result = NumberA * NumberB; return result; } } /// <summary> /// 除法 /// </summary> internal class OperationDiv:Operation { public override double GetResult() { double result = 0; if (NumberB==0) { throw new Exception("除数不能为0."); } result = NumberA / NumberB; return result; } } /// <summary> /// 简单工厂类 /// </summary> public class OperationFactory { public static Operation CreateOperate(string operate) { Operation oper = null; switch (operate) { case "+": oper = new OperationAdd(); break; case "-": oper = new OperationSub(); break; case "*": oper = new OperationMul(); break; case "/": oper = new OperationDiv(); break; } return oper; } } }
客户端调用代码:
/* * 采用面向对象的思想写出控制台计算器。 * 运用简单工厂模式 */ using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SimpleFactoryPattern { class Program { static void Main(string[] args) { Operation oper; oper = OperationFactory.CreateOperate("+"); oper.NumberA = 1; oper.NumberB = 2; double result = oper.GetResult(); Console.WriteLine("输出结果:"+result); Console.ReadLine(); } } }