抽象工厂模式-与-工厂方法模式区别

来源:互联网 发布:剪裁图片大小的软件 编辑:程序博客网 时间:2024/05/16 05:00

转载自:http://blog.csdn.net/wangwenhui11/article/details/3955125

对于java来说,你能见到的大部分抽象工厂模式都是这样的:

它的里面是一堆工厂方法,每个工厂方法返回某种类型的对象。
比如说工厂可以生产鼠标和键盘。那么抽象工厂的实现类(它的某个具体子类)的对象都可以生产鼠标和键盘,但可能工厂A生产的是罗技的键盘和鼠标,工厂B是微软的。


这样A和B就是工厂,对应于抽象工厂;
每个工厂生产的鼠标和键盘就是产品,对应于工厂方法;


用了工厂方法模式,你替换生成键盘的工厂方法,就可以把键盘从罗技换到微软。但是用了抽象工厂模式,你只要换家工厂,就可以同时替换鼠标和键盘一套。如果你要的产品有几十个,当然用抽象工厂模式一次替换全部最方便(这个工厂会替你用相应的工厂方法)


所以说抽象工厂就像工厂,而工厂方法则像是工厂的一种产品生产线
---------------------------------
“抽象工厂”模式依赖于“工厂方法”模式的。因此,抽象工厂强调的是前面的动词“抽象”,也就是说,你将工厂方法模式中的工厂方法抽象出来的那个"动作或设计"就是“抽象工程”模式了。
---------------------------------
factory method针对的是一个产品等级结构  
abstract factory是面向多个产品等级结构的
---------------------------------
工厂方法模式:一个抽象产品类,可以派生出多个具体产品类。 
                              一个抽象工厂类,可以派生出多个具体工厂类。 
                              每个具体工厂类只能创建一个具体产品类的实例。 
抽象工厂模式:多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。 
                              一个抽象工厂类,可以派生出多个具体工厂类。 
                              每个具体工厂类可以创建多个具体产品类的实例。 
  
区别:工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
      工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
---------------------------------
   1.如果一个后花园只种蔬菜类,那么就用简单工厂就可以了.
   2.如果后花园蔬菜品种繁多.得用工厂方法才可以,把共有的东西抽象出来.
   3.如果要扩大后花园的规模,比如一个在北方,一个在南方,这样工厂方法就无法实现了,就应当用抽象工厂,把各种各样的植物,又组成一个后花园.
所以我个人认为,简单工厂是一个工厂只生产一类的产品,面对的是具体的类,工厂方法是可以生产不同的产品,把公共的方法抽象出来,然后进行创建各种各样的产品.抽象工厂把几种产品划出共同的东西,把相互依赖的对象抽象出来,只要实现这些接口就可以得到不同的产品.
具体例子:
1.简单工厂:


using System; 
public interface ICar 

     void run(); 



public class BMWCar : ICar 

     public void run() 
     { 
         Console.WriteLine("BMWCar run"); 
     } 



public class BenzCar : ICar 

     public void run() 
     { 
         Console.WriteLine("BenzCar run"); 
     } 



public class Driver 

     public static ICar DriverCar(string carType) 
     { 
         switch (carType) 
         { 
             case "BMWCar": return new BMWCar(); 
             case "BenzCar": return new BenzCar(); 
             default: throw new Exception(); 
        } 
     } 



public class Client 

     public static void Main() 
     { 
         ICar myCar = Driver.DriverCar("BenzCar"); 
         myCar.run(); 
         Console.Read(); 
     } 
}


心得:优点是只要实现共有的接口就可以实现不同车跑的方式.但缺点就是要判断哪一种车,造成要修改Driver 类
2.工厂方法:
using System; 
public interface ICar 

     void run(); 



public class BMWCar : ICar 

     public void run() 
     { 
         Console.WriteLine("BMWCar run"); 
     } 



public class BenzCar : ICar 

     public void run() 
     { 
         Console.WriteLine("BenzCar run"); 
     } 

public abstract class Driver 

     public abstract ICar DriverCar(); 



public class BMWDriver : Driver 

     public override ICar   DriverCar() 
     { 
         return new BMWCar(); 
     } 



public class BenzDriver : Driver 

     public   override ICar DriverCar() 
     { 
         return new BenzCar(); 
     } 



class Client 

     public static void Main() 
     { 
         Driver myDriver = new BenzDriver(); 
         ICar myCar = myDriver.DriverCar(); 
         myCar.run(); 
         Console.Read(); 
     } 
}


心得:优点是符合了开放-封闭原则(OCP),从整体上还看不出什么缺点.


3.抽象工厂:


using System; 


public interface IBusinessCar 

     void run(); 



public interface ISportCar 

void run(); 



public class BMWBusinessCar : IBusinessCar 

     public void run() 
     { 
         Console.WriteLine("BMWCar run"); 
     }


}


public class BenzBusinessCar : IBusinessCar 

     public void run() 
     { 
         Console.WriteLine("BenzBusinessCar run"); 
     } 



public class BMWSportCar:ISportCar 

public void run() 

Console.WriteLine("BMWSportCar run"); 




public class BenzSportCar:ISportCar 

public void run() 
{


Console.WriteLine("BenzSportCar run"); 




public interface IDriver 

IBusinessCar BusinessCarDriver(); 
ISportCar SportCarDriver(); 



public class BMWDriver:IDriver 

public IBusinessCar BusinessCarDriver() 

return new BMWBusinessCar(); 

public ISportCar SportCarDriver() 

return new BMWSportCar(); 




public class BenzDriver:IDriver 

public IBusinessCar BusinessCarDriver() 

return new BenzBusinessCar(); 



public ISportCar SportCarDriver() 

return new BenzSportCar(); 

}




class Client 

     public static void Main() 
     { 
         IDriver myDriver =new BenzDriver(); 
         ISportCar myCar = myDriver.SportCarDriver(); 
         myCar.run(); 
         Console.Read(); 
     }


}




心得:抽象方法似乎达到了完美境界.把开奔驰的司机和开宝马的司机的公共方法抽象出来,并对不同的司机创建不同的类,到时候不管是开什么车的司机随你添加.它们唯一的共同点都是开车.
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 收割机滚筒皮带轮键槽滚了怎么办 微信界面变小了怎么办 拉杆箱螺丝掉了怎么办 洗衣机应急门锁没有拉绳怎么办? 奔驰glc发动机声音大怎么办 淋膜机模具螺丝拧不动怎么办 一字螺丝滑丝了怎么办 螺丝拧歪卡住了怎么办 车牌螺丝拧歪了怎么办 空心墙打膨胀螺丝打不上怎么办 沉孔内六角螺丝滑丝怎么办 内六角螺丝滑了怎么办? 三色灯不变光了怎么办 卧室灯不变色了怎么办 圆柱齿轮减速机噪音大怎么办 轴与套间隙生锈怎么办 汽车停小区被刮怎么办 下楼梯摔跤了 屁股疼 怎么办 剧烈咳嗽震的肚子疼怎么办 饺子粘在盘子上怎么办 生饺子粘在盘子怎么办 饺子粘在案板上怎么办 饺子冷冻粘起了怎么办 冰箱饺子冻住了怎么办 水饺都冻一块了怎么办 wps卸载了后文件打不开怎么办 六角螺母拧滑了怎么办 梅花内六角螺丝扭滑丝了怎么办 眼镜螺丝滑丝了怎么办 大螺丝拆不下来怎么办 一字螺丝扭不动怎么办 带帽的螺丝拧花怎么办 螺丝拧不出来了怎么办 小六角螺丝滑丝怎么办 螺丝拧不下来了怎么办 固定水龙头的螺母扭不动怎么办 小螺丝帽拧花了怎么办 6角螺丝帽拧圆了怎么办 眼镜螺丝滑扣了怎么办 眼镜的螺丝掉了怎么办 螺丝松了怎么办小窍门