工厂方法

来源:互联网 发布:java人事管理系统项目 编辑:程序博客网 时间:2024/06/05 19:37

http://blog.csdn.net/lhc1105/article/details/21038213


模型


  

工厂方法模式(factory method):定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法是一个类的实例化延迟到其子类。


工厂方法和简单工厂方法看起来大部分是一样的,只是在工厂这里,简单工厂是通过Switch语句进行选择然后实例化对象,而在工厂方法里面,对工厂进一步抽象,定义了一个工厂接口,让每一类产品对应一个工厂接口,在实例化具体产品的时候,要通过实现工厂接口的类进行。


两种方法的比较:

   工厂方法克服了简单工厂违背开放—封闭原则的缺点,又保持了封装对象创建过程的优点。

   它们都是集中封装了对象的创建,使得要更换对象时,不需要做大的改动就可实现,降低了客户程序与产品对象的耦合。工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。但缺点是由于每加一个产品,就需要加一个产品工厂的类,增加了额外的开发量。


   示例

          在学习简单工厂的时候,我写过一个CPU生产的例子(简单工厂模式),现在把这个例子稍加改动,它就成了工厂方法的例子。如图:

  


在这里,将工厂类去掉,但是抽象出来Client接口,并让3个具体的工厂方法去实现这个接口。也就是说,用子类的Client8085,Client8080,Client8086去决定实例化哪一个类。通过这样的改动,将一个类的实例化延迟到了其子类。


代码如下:


[csharp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. namespace 生产CPU  
  2. {  
  3.     public class Cpu8086 : CPU  //8086CPU  
  4.     {  
  5.         public Cpu8086()  
  6.         {  
  7.             this.size = "8086";  
  8.             Console.WriteLine("生产的是8086CPU。");  
  9.         }  
  10.   
  11.   
  12.     }  
  13.   
  14.     public class Cpu8080 : CPU  //8080CPU  
  15.     {  
  16.         public Cpu8080()  
  17.         {  
  18.             this.size = "8080";  
  19.             Console.WriteLine("生产的是8080CPU。");  
  20.         }  
  21.   
  22.   
  23.     }  
  24.   
  25.     public class Cpu8085 : CPU  //8085CPU  
  26.     {  
  27.         public Cpu8085()  
  28.         {  
  29.             this.size = "8085";  
  30.             Console.WriteLine("生产的是8085CPU。");  
  31.         }  
  32.   
  33.   
  34.     }  
  35.   
  36.   
  37.     public class CPU  //CPU类  
  38.     {  
  39.         private string Size;  
  40.   
  41.         public string size  
  42.         {  
  43.             get { return Size; }  
  44.             set { Size = value; }  
  45.         }  
  46.   
  47.   
  48.     }  
  49.        
  50.     interface Client   //定义一个选择生产CPU的接口(客户的抽象)  
  51.     {  
  52.         CPU ChooseCpu();  
  53.   
  54.     }  
  55.   
  56.     class Client8086 : Client   //生产8086CPU的工厂类  
  57.     {  
  58.         public CPU ChooseCpu()  
  59.         {  
  60.             return new Cpu8086();  
  61.         }  
  62.     }  
  63.   
  64.     class Client8085 : Client  //生产8085CPU的工厂类  
  65.     {  
  66.         public CPU ChooseCpu()  
  67.         {  
  68.             return new Cpu8085();  
  69.         }  
  70.     }  
  71.   
  72.     class Client8080 : Client   //生产8080CPU的工厂类  
  73.     {  
  74.         public CPU ChooseCpu()  
  75.         {  
  76.             return new Cpu8080();  
  77.         }  
  78.     }  
  79.   
  80.   
  81.     class Program  
  82.     {  
  83.         static void Main(string[] args)  
  84.         {  
  85.             Client client = new Client8080();  //生产8080CPU  
  86.             CPU CpuType = client.ChooseCpu();     
  87.         }  
  88.     }  
  89. }  

工厂方法虽然增加了额外的类,但是这样做是有好处的,例如:



   

0 0
原创粉丝点击