一、引子
十年前,有一个爆发户,他家有三辆汽车(Benz(奔驰)、Bmw(宝马)、Audi(奥迪)),还雇了司机为他开车。不过,爆发户坐车时总是这样:上Benz车后跟司机说“开奔驰车!”,坐上Bmw后他说“开宝马车!”,坐上 Audi后他说“开奥迪车!”。
你一定说:这人有病!直接说开车不就行了?!而当把这个爆发户的行为放到我们程序语言中来,我们发现C语言一直是通过这种方式来坐车的!
引用文章:
二、c# 版简单工厂模式
这个模式本身很简单而且使用在业务较简单的情况下。一般用于小项目或者具体产品很少扩展的情况(这样工厂类才不用经常更改)。
它由三种角色组成:
工厂类角色:这是本模式的核心,一般包含了判断逻辑和部分处理逻辑,根据逻辑的不同,产生具体的产品。如例子中的 CarFactory 类。
抽象产品角色:它一般是具体产品继承的父类或者实现的接口。由接口或者抽象类来实现。如例中的 Car 抽象类。
具体产品角色:工厂类所创建的对象就是此角色的实例。在 C# 中由具体类实现,如例子中的 RedCar 、BlueCar 类。
类图请参考 原文章。
以控制台程序为例.
先定义好抽象的车(抽象类).
/// <summary> /// 抽象车类 /// </summary> public abstract class Car { /// <summary> /// 跑 方法 /// </summary> public abstract void run(); }
接下来继承抽象车类,具体的类(具体的产品类):
/// <summary> /// 默认的普通车 /// </summary> public class DefaultCar : Car { public override void run() { Console.WriteLine("I'm a DefaultCar,I'm running!"); } } /// <summary> /// 红车 /// </summary> public class RedCar : Car { public override void run() { Console.WriteLine("I'm a RedCar,I'm running!"); } } /// <summary> /// 蓝车 /// </summary> public class BlueCar : Car { public override void run() { Console.WriteLine("I'm a BlueCar,I'm running!"); } }
接下来,我们实现一下工厂类,将对应的车取出来:
/// <summary> /// 车工厂 /// </summary> public class CarFactory { /// <summary> /// 根据车的颜色得到具体的车 /// </summary> /// <param name="carColor"></param> /// <returns></returns> public static Car GetCar(string carColor) { Car ResultItem = null; switch (carColor) { case "red": ResultItem = new RedCar(); break; case "blue": ResultItem = new BlueCar(); break; default: ResultItem = new DefaultCar(); break; } return ResultItem; } }
调用试下:
static void Main(string[] args) { Car cItem = null; Console.WriteLine("Red Car coming!"); cItem = CarFactory.GetCar("red"); cItem.run(); Console.WriteLine("Blue Car coming!"); cItem = CarFactory.GetCar("blue"); cItem.run(); Console.WriteLine("Default Car coming!"); cItem = CarFactory.GetCar(""); cItem.run(); Console.ReadLine(); }
这样,我们就完成了一个简单工厂例子,用户不用管它内部是什么处理逻辑,只需要告诉工厂类,我要什么东西,工厂类返回对应的类给用户,让用户去调用,用户不需要去管它是红车还是蓝车,可以直接使用。