设计模式深入学习-Factory Method设计模式

来源:互联网 发布:部队建设强军数据 编辑:程序博客网 时间:2024/05/21 08:50
   今天我们继续来聊下Factory Method创建型设计模式。在我们的开发中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象经常面临着剧烈的变化,但是它却拥有比较稳定的接口。 那么我们应该如何应付这样的变化,怎么提供一种“封装机制”来隔离出“这个易变对象”的变化,从而保持系统中“其他依赖该对象的对象”不随着需求改变而改变呢?而我们今天介绍的 Factory Method创建型设计模式就是为了处理这样的情况而产生的。  
   我们先举个例子,假如我们要在UI画面上面创建一个汽车模型,按照一个普通的套路就是new 一个汽车类,然后显示。又或者做一个更适合解耦合的套路就是出一个汽车的抽象基类,然后用一个实体汽车类去继承,然后new出来。最后填充数据。我们现在的这个做法呢和后者类似,只不过会更多一步,把这个实体汽车类封装,然后在调用这个封装步骤。下面用代码示例一步步讲解。

   首先我们总得有个汽车的抽象类吧。那么这个抽象类就先有制作,开动,转弯,停车这几个抽象方法吧。

public abstract class AbstractCar   {        public abstract void StartUp();         public abstract void Run();        public abstract void Turn();        public abstract void Stop();    }

  然后,我们在制作一个汽车工厂类的抽象类,好让我们做封装实体类。

public abstract class CarFactory  {      public abstract AbstractCar CreateCar();   }

好了,那么现在就是我们做一步 封装实体类,我们的实体类有两个,比如这个实体类叫奇瑞QQ汽车(腾讯公司看到请给我广告费)那么我们就在构造一个 奇瑞汽车类 和 奇瑞汽车工厂类 ,分别继承我们的汽车抽象类和 汽车工厂抽象类。

public class BiYaDiCarFactory : CarFactory  {      public override AbstractCar CreateCar()      {         return new BiYaDiCar();      }  }public class BiYaDiCar :AbstractCar {             public override void StartUp()     {         Console.WriteLine("比亚迪汽车开始制作");     }      public override void Run()     {          Console.WriteLine("比亚迪汽车开动");      }      public override void Turn()     {          Console.WriteLine("比亚迪汽车转弯");      }       public override void Stop()     {          Console.WriteLine("比亚迪汽车停车");      }   }

   并且我们在这个汽车实体类 里面 重写了汽车的方法。好了,下一步就是我们的调用了 ,那你可能说了,这样有什么意义,写那么多层不是浪费时间么,当然,如果我们只有这么一个汽车的话,这样写确实是在浪费时间,所以我们现在再多写一个作为对照吧。 我们就在多做一个 比亚迪汽车吧。

public class BiYaDiCar :AbstractCar  {               public override void StartUp()      {          Console.WriteLine("比亚迪汽车开始制作");      }       public override void Run()      {           Console.WriteLine("比亚迪汽车开动");       }       public override void Turn()      {           Console.WriteLine("比亚迪汽车转弯");       }        public override void Stop()      {           Console.WriteLine("比亚迪汽车停车");       }    public class BiYaDiCarFactory : CarFactory   {       public override AbstractCar CreateCar()       {          return new BiYaDiCar();       }   }   }

   同样的,这个比亚迪汽车也是写了两个类,汽车类和汽车工厂类,分别继承汽车抽象类和汽车工厂抽象类。 OK,到这里我们需要达到的目的完成了大半了,最后我们再来一个调用这些汽车的类。

public class CarTestFramework {    public void BuildTestContext(CarFactory CarF)    {        AbstractCar car1 = CarF.CreateCar();         car1.StartUp();         car1.Run();         car1.Turn();         car1.Stop();    } }

   这个类主要用来创建汽车,运行汽车类的方法。 然后就到了最后一步,我们去使用这个调用类,来分别新建出两个汽车并且跑起来。

class Program   {       static void Main(string[] args)       {           CarTestFramework carTF=new CarTestFramework();           carTF.BuildTestContext(new QiRuiCarFactory());           carTF.BuildTestContext(new BiYaDiCarFactory());           Console.ReadKey();       }   }

   完成,我们在这个Main方法的类中 new 了一个新建汽车的类,然后分别传输奇瑞和比亚迪汽车的工厂类进去,然后就会通过工厂类去构造各自的汽车类出来,而又不影响其他运行了该接口的类,比如比亚迪汽车新出了电动车,那么我们修改比亚迪汽车工厂类就可以了,不需要对汽车抽象类做改动,从而不会影响奇瑞汽车。这样就很好的保证了各个模块之间的稳定性。现在我们运行看看:

  

   好了,以上就是Factory Method设计模式的体现,现在我们再来回顾下 Factory Method设计模式的几个要点。
   Factory Method设计模式主要用于隔离类对象的使用者和具体类型之间的耦合关系,面对一个经常变动的具体类型,紧耦合关系会导致软件的脆弱。
Factory Method设计模式通过面向对象的手法,将所要创建的具体对象工作延迟到子类,从而实现一种扩展(而非更改)的策略,较好的解决了这种紧耦合关系。
   Factory Method设计模式解决“单个对象”的需求变化, AbstractFactory 模式解决“系列对象”的需求变化,Builder模式解决“对象部分”的需求变化。

0 0
原创粉丝点击