设计模式对于很多做程序的同仁来说,是很熟悉了。即使没有详细地去研究,也会常常耳闻目染。 我也有同样的感受。一直以来大多是有意或无意使用着、遵循着某些设置模式。但是迄今为止还没有来得及坐下来好好的研究、学习。今后的一段日子里,我将重新来学习一遍设计模式,以补自己的不足。我也将会把学习研究的过程以笔记的形式留于博客,一方面方便以后查询温故 ,另一方面可以帮助像我这样还没有深入学习过设计模式的同仁、朋友、网友一点点启发。(至于过往的设计模式高人,让您见笑了,有什么不对地方还望高人不吝尊开金口赐教一翻)
简单工厂模式,在OO程序设计中经常会在不知不觉中应用到一种模式就是简单工厂模式(Simple Factory Pattern)。根据提供给它的数据,返回几个可能类中的一个类的实例。这便是简单工厂模式从OO思想上的基本概念。继续前面概念的说明:通常情况下,它返回的实例的类都有一个共同的父类和共同的方法,但各自方法执行的任务不同,而且根据不同的数据进行了优化。简单工厂模式不属于23个GoF模式。
接下来从代码的角度出发利用实例来说明简单工厂设计模式。代码为C#语言(在后续笔记中如没有特别指定语言默认都为C#)。在例子中用到了Factory类。假设现在有一交通工具基类Vehicle,它有一运行动作Run的抽象方法,然后有两子类Car和Plane继承于交通工具类,子类各自实现了自己的运行方法Run。
public class Vehicle
... {
public abstract void Run();
}
// 汽车类
public class Car:Vehicle
... {
public void Run()
...{
//实现Car的运行代码
}
}
// 飞机类
public class Plane:Vehicle
... {
public void Run()
...{
//实现Plane的运行代码
}
}
// 工厂类
public class Factory
... {
public Vehicel GetVehicle(string VehicelName)
...{
switch(VehicelName)
...{
case "Car":
return new Car();
break;
case "Plane":
return new Plane();
break;
}
}
}
使用基类Vehicle(交通工具类)变量接收子类汽车或飞机类的实例。然后运行Run,实现了统一的调用方式。无论子类是什么总可以用转化为基类的实例。其实这个特性是OO思想三大特性之一的多态性的体现。
Vehicle vCar = factory .GetVehicle( " Car " );
vCar .Run(); // 汽车运行
Vehicle vPlane = factory .GetVehicle( " Plane " );
vPlane .Run(); // 飞机运行
下面是简单工厂模式类图:
可见简单工厂能返回具有同样方法的类的实例,他们可能是不同的派生子类的实例,可能是实际上毫无关系仅仅是共享了相同的接口的类(此处并没有针对共享相同接口的情况举例)。不管是哪一种形式。这些类实例中的方法必须是相同的,并且能够交替使用。