简单工厂几乎都算不上是设计模式,同时也不符合开放-封闭的面向对象原则,每次的修改都要更改工厂类,但是同时也是平时中用的最多的一种设计模式,比如数据访问层设计多数据库访问。
简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。 就是说解耦全部靠工厂类来实现。
下面,我们以经典的计算器为案例,分析下简单工厂。
创建运算操作符的基类,定义2个变量,一个运算的方法。
public abstract class 操作符基类 { public double A; public double B; public abstract double 运算(); }
实现操作符的加减乘除类(这个可随意扩展,也符合开放封闭原则)
public class 加法 : 操作符基类 { public override double 运算() { return A + B; } } public class 减法 : 操作符基类 { public override double 运算() { return A - B; } } public class 乘法 : 操作符基类 { public override double 运算() { return A * B; } } public class 除法 : 操作符基类 { public override double 运算() { if (B.Equals(0)) { throw new Exception("被除数不能为0"); } return A / B; } }
工厂类,用来负责创建对象,解耦合,但是这个类会经常改动,这是一个非常大的缺点。
public static 操作符基类 创建操作类(string op) { 操作符基类 result = null; switch (op) { case "+": result = new 加法(); break; case "-": result = new 减法(); break; case "*": result = new 乘法(); break; case "/": result = new 除法(); break; } return result; }
客户端调用起来非常方便,最重要的时候 不用管里面的实现。
static void Main(string[] args) { 操作符基类 op = 简单工厂.创建操作类("+"); op.A = 1.0; op.B = 3.5; Console.WriteLine(op.运算()); Console.ReadLine(); }
简单工厂模式:就是如何去实例化对象的问题,对于很容易变化的问题,应该考虑用一个单独的类来做这个创造实例的过程,这就是工厂。