在软件系统中,经常面临“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口,为了提供一种“封装机制”来隔离出“这个易于变化对象”的变化,从而保持系统中“其它依赖该对象的对象”不随着需求的改变而改变,就可以使用工厂方法模式来解决这个问题。
下面我们以一个简单的汽车测试案例来初步认识工厂方法模式:
在测试汽车的时候因为被测试的汽车是会经常改变的,如我们会测试奔驰、比亚迪汽车,然而不管什么汽车都有一些共同的特征,所以我们就可以封装出这些共同的特征做成一个抽象类或者接口,汽车抽象类如下:
public abstract class AbstractCar { public abstract void Startup(); public abstract void Run(); public abstract void Stop(); }
现在我们有一个具体待测试的汽车--奔驰汽车,所以接下来我们创建一个具体的奔驰汽车类:
public class BenzCar : AbstractCar { public override void Startup() { Console.WriteLine("奔驰开动了!"); } public override void Run() { Console.WriteLine("奔驰在行驶!"); } public override void Stop() { Console.WriteLine("奔驰停止了!"); } }
由于在这个案例中最易于变化的就是将会被我们测试的汽车,即创建一个具体的汽车对象,所以我们就需要抽象出汽车的创建,创建一个抽象的汽车工厂类:
public abstract class AbstractFactory { public abstract AbstractCar CreateInstance(); }
当我们现在知道即将被我们测试汽车是奔驰汽车时,我们就可以实现这个抽象的创建工厂类,创建一个具体的奔驰汽车创建类:
public class BenzFactory : AbstractFactory { public override AbstractCar CreateInstance() { return new BenzCar(); } }
在客户端程序中,我们就只需要实例化需要被我们测试的汽车创建工厂类:
class Program { static void Main(string[] args) { AbstractFactory benzFactory = new BenzFactory(); AbstractCar benz = benzFactory.CreateInstance(); benz.Startup(); benz.Run(); benz.Stop(); } }
现在如果奔驰测试完成了,我们要继续测试一辆比亚迪汽车,我们只需要实现一个比亚迪的汽车类,然后实现一个比亚迪的工厂类,客户端程序中就仅仅只需要更改创建的工厂,这时候我们可能会想到如果我们将需要被测试的汽车创建工厂写入配置文件中,那么我们的客户端程序甚至不需要做出任何的更改,的确是这样,这完全达到了我们面向对象开发中的“高类聚低耦合”的思想。这也就是我们需要在项目开发中使用设计模式的目的。
工厂方法模式的总结:
- 工厂方法模式主要用于隔离类对象的使用者和具体类型之间的耦合关系。面对一个经常变化的具体类型,紧耦合关系会导致软件的脆弱。
- 工厂方法模式主要通过面向对象的手法,将所要创建的具体对象工作延迟到子类,从而实现一种扩展而非更改的策略,较好地解决了这种耦合关系
下一篇,将详细了解工厂方法模式在实际项目开发中的具体应用。