设计模式系列——三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)

时间:2022-10-01 23:13:20

被腾讯笔试打击到了,腾讯笔试的设计模式题目都没有做对过,所以我要学习下设计模式,就买了入门的《大话设计模式》这本书。

我从昨天下午开始看这本书,今天中午看完,发现这本书浅显易懂,作为入门读物还是不错的。  

  好脑子不如烂笔头,我还是将所学的东西记载下来,供我以后来看吧。
简单工厂模式
设计模式系列——三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)


当需要加法类的时候,调用工厂类的CreateOperate(),要指定制造的Product

  例如在大话设计模式P11给的运算工厂例子:


点击(此处)折叠或打开

  1. public static Operation createOperate(string operate)
  2. {
  3.     Operation oper=null;
  4.     switch(operate)
  5.     {
  6.         case"+":
  7.             {
  8.             oper = new OperationAdd();
  9.             break;
  10.             }
  11.         case"-":
  12.             {
  13.             oper = new OperationSub();
  14.             break;
  15.             }
  16.         case"*":
  17.             {
  18.             oper = new OperationMul();
  19.             break;
  20.             }
  21.         case"/":
  22.             {
  23.             oper = new OperationDiv();
  24.             break;
  25.             }
  26.     }
  27.     return oper;
  28. }
  29. }


调用工厂,需要createOperator("/"),就能返回除法运算符。
  优点:客户端不需要修改代码。
  缺点: 当需要增加新的运算类的时候,不仅需新加运算类,还要修改工厂类,违反了开闭原则。



工厂方法模式

  UML类图如下:


设计模式系列——三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)

这个和简单工厂有区别,简单工厂模式只有一个工厂,工厂方法模式对每一个产品都有相应的工厂

  好处:增加一个运算类(例如N次方类),只需要增加运算类和相对应的工厂,两个类,不需要修改工厂类。

  缺点:增加运算类,会修改客户端代码,工厂方法只是把简单工厂的内部逻辑判断移到了客户端进行。


抽象工厂模式:

  UML类图如下:

设计模式系列——三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)

    从图上可以看出这和工厂方法模式很相似,但是呢,有几个区别:
  抽象工厂模式,一个具体工厂可以制造几个产品,例如微软工厂(相当于SqlserverFactory)可以制造微软鼠标(属于鼠标类,鼠标类下面有惠普鼠标,微软鼠标等,相当于上图中的IDepartment下面的SqlserverDepartment和AccessDepartment),也可以制造微软键盘(属于键盘类,键盘类下面有惠普键盘,微软键盘等,相当于上图中的IUser下面的SqlserverUser和AccessUser)。
  引用http://blog.csdn.net/wangwenhui11/article/details/3955125中的话:
            工厂方法模式:一个抽象产品类,可以派生出多个具体产品类。   
                                一个抽象工厂类,可以派生出多个具体工厂类。 
                      每个具体工厂类只能创建一个具体产品类的实例。 
          抽象工厂模式:多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。 
                              一个抽象工厂类,可以派生出多个具体工厂类。 
                              每个具体工厂类可以创建多个具体产品类的实例。 
            区别:工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
               工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。

抽象工厂模式代码

 产品类: 

[java] view plain copy print?
  1. //发动机以及型号    
  2. public interface Engine {    
  3.   
  4. }    
  5. public class EngineA extends Engine{    
  6.     public EngineA(){    
  7.         System.out.println("制造-->EngineA");    
  8.     }    
  9. }    
  10. public class EngineBextends Engine{    
  11.     public EngineB(){    
  12.         System.out.println("制造-->EngineB");    
  13.     }    
  14. }    
  15.   
  16. //空调以及型号    
  17. public interface Aircondition {    
  18.   
  19. }    
  20. public class AirconditionA extends Aircondition{    
  21.     public AirconditionA(){    
  22.         System.out.println("制造-->AirconditionA");    
  23.     }    
  24. }    
  25. public class AirconditionB extends Aircondition{    
  26.     public AirconditionB(){    
  27.         System.out.println("制造-->AirconditionB");    
  28.     }    
  29. }   


创建工厂类:

[java] view plain copy print?
  1. //创建工厂的接口    
  2. public interface AbstractFactory {    
  3.     //制造发动机  
  4.     public Engine createEngine();  
  5.     //制造空调   
  6.     public Aircondition createAircondition();   
  7. }    
  8.   
  9.   
  10. //为宝马320系列生产配件    
  11. public class FactoryBMW320 implements AbstractFactory{    
  12.         
  13.     @Override    
  14.     public Engine createEngine() {      
  15.         return new EngineA();    
  16.     }    
  17.     @Override    
  18.     public Aircondition createAircondition() {    
  19.         return new AirconditionA();    
  20.     }    
  21. }    
  22. //宝马523系列  
  23. public class FactoryBMW523 implements AbstractFactory {    
  24.     
  25.      @Override    
  26.     public Engine createEngine() {      
  27.         return new EngineB();    
  28.     }    
  29.     @Override    
  30.     public Aircondition createAircondition() {    
  31.         return new AirconditionB();    
  32.     }    
  33.   
  34.   
  35. }   

客户:

[java] view plain copy print?
  1. public class Customer {    
  2.     public static void main(String[] args){    
  3.         //生产宝马320系列配件  
  4.         FactoryBMW320 factoryBMW320 = new FactoryBMW320();    
  5.         factoryBMW320.createEngine();  
  6.         factoryBMW320.createAircondition();  
  7.             
  8.         //生产宝马523系列配件    
  9.         FactoryBMW523 factoryBMW523 = new FactoryBMW523();    
  10.         factoryBMW320.createEngine();  
  11.         factoryBMW320.createAircondition();  
  12.     }