今天要说的重构最早由Gof提出,在网络上可以找到很多的资源。两个不同的工厂模式可以在这里找到:Abstract Factroy Factory Method
通常我们需要在代码中设置一些对象,以便获得它们的状态,从而使用对象,所谓的设置通常来说就是创建对象的实例并调用对象的方法。有时如果要创建的对象很多,则代码会变的复杂。这便是工厂模式发挥作用的情形。关于工厂模式的完整描述可以从这里查看。工厂模式的复杂应用是使用抽象工厂(Abstract Factory)创建对象集,但我们在这里只是使用基本的工厂类创建对象的一个实例。让我们来看下面的代码:
1: public class PoliceCarController
2: {
3: public PoliceCar New(int mileage, bool serviceRequired)
4: {
5: PoliceCar policeCar = new PoliceCar();
6: policeCar.ServiceRequired = serviceRequired;
7: policeCar.Mileage = mileage;
8:
9: return policeCar;
10: }
11: }
在上面的代码中,New方法的目的是创建PolicaCar的实例并根据外部输入设置实例的属性,在一般情形下,New方法可以良好工作,但是随着时间的推移,
PoliceCar的创建工作要做的事件会越来越多,其中有一些事情不应该出现在PoliceCarController中,在这种情形下我们将PoliceCar的创建工作从
PoliceCarController中提到到工厂类中。
1: public interface IPoliceCarFactory
2: {
3: PoliceCar Create(int mileage, bool serviceRequired);
4: }
5:
6: public class PoliceCarFactory : IPoliceCarFactory
7: {
8: public PoliceCar Create(int mileage, bool serviceRequired)
9: {
10: PoliceCar policeCar = new PoliceCar();
11: policeCar.ReadForService = serviceRequired;
12: policeCar.Mileage = mileage;
13: return policeCar;
14: }
15: }
16:
17: public class PoliceCarController
18: {
19: public IPoliceCarFactory PoliceCarFactory { get; set; }
20:
21: public PoliceCarController(IPoliceCarFactory policeCarFactory)
22: {
23: PoliceCarFactory = policeCarFactory;
24: }
25:
26: public PoliceCar New(int mileage, bool serviceRequired)
27: {
28: return PoliceCarFactory.Create(mileage, serviceRequired);
29: }
30: }
现在我们将创建逻辑提取到工厂类中,我们可以添加另一个类来创建对象的实例却不用担心引入重复代码。
原文链接:http://www.lostechies.com/blogs/sean_chambers/archive/2009/08/19/refactoring-day-19-extract-factory-class.aspx