说明:这篇blog写的很好,有助于理解工厂方法与抽象工厂模式的联系与区别。 原文链接:http://blog.csdn.net/yzxz/article/details/4601152

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

工厂方法UML图:

抽象工厂UML图: 

---------------------------------
对于java来说,你能见到的大部分抽象工厂模式都是这样的:
它的里面是一堆工厂方法,每个工厂方法返回某种类型的对象。

比如说工厂可以生产鼠标和键盘。那么抽象工厂的实现类(它的某个具体子类)的对象都可以生产鼠标和键盘,但可能工厂A生产的是罗技的键盘和鼠标,工厂B是微软的。

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

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

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

[java] view plaincopy
  1. package com.lucius.creational.patterns.simpleFactoryPattern;
  2. public interface Icar{
  3. void run();
  4. }
  5. public class BMWCar implements ICar{
  6. public void run(){
  7. System.out.println("BMWCar run!");
  8. }
  9. }
  10. public class BenzCar implements ICar{
  11. public void run(){
  12. System.out.println("BenzCar run!");
  13. }
  14. }
  15. public class Driver{
  16. public enum carType{
  17. BMW,
  18. Benz
  19. }
  20. public static ICar DriverCar(String carType){
  21. switch(carType){
  22. case BMW :
  23. return new BMWCar();
  24. case Benz :
  25. return new BenzCar();
  26. }
  27. }
  28. public class client{
  29. public static void main(String[] args){
  30. ICar myCar = Driver.DriverCar("Benz");
  31. myCar.run();
  32. }
  33. }
  34. }

心得:优点是只要实现共有的接口就可以实现不同车跑的方式.但缺点就是要判断哪一种车,造成要修改Driver 类

2.工厂方法:

[java] view plaincopy
  1. package com.lucius.creational.patterns.factoryPattern;
  2. public interface ICar{
  3. public void run();
  4. }
  5. public class BMWCar implements ICar{
  6. public void run(){
  7. System.out.println("BMWCar run!");
  8. }
  9. }
  10. public class BenzCar implements ICar{
  11. public void run(){
  12. System.out.println("BenzCar run!");
  13. }
  14. }
  15. public interface IDriver{
  16. public Icar driverCar();
  17. }
  18. public class BMWCarDriver implements IDriver{
  19. public ICar driverCar(){
  20. return new BMWCar();
  21. }
  22. }
  23. public class BenzCarDriver implements IDriver{
  24. public ICar driverCar(){
  25. return new BenzCar();
  26. }
  27. }
  28. public class client{
  29. public static void main(String[] args){
  30. IDriver myDriver = new BenzCarDriver();
  31. Icar myCar = myDriver.driverCar();
  32. myCar.run();
  33. }
  34. }

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

3.抽象工厂:

[java] view plaincopy
  1. package com.lucius.creational.patterns.AbstractFactoryPattern;
  2. public interface IBusinessCar{
  3. public void run();
  4. }
  5. public interface ISportCar{
  6. public void run();
  7. }
  8. public class BMWBusinessCar implements IBusinessCar{
  9. public void run(){
  10. System.out.println("BMWBusinessCar run!");
  11. }
  12. }
  13. public class BenzBusinessCar implements IBusinessCar{
  14. public void run(){
  15. System.out.println("BenzBusinessCar run!");
  16. }
  17. }
  18. public class BMWSportCar implements ISportCar{
  19. public void run(){
  20. System.out.println("BMWSportCar run!");
  21. }
  22. }
  23. public class BenzSportCar implements ISportCar{
  24. public void run(){
  25. System.out.println("BenzSportCar run!");
  26. }
  27. }
  28. public interface IDriver{
  29. IBusinessCar BusinessCarDriver();
  30. ISportCar SportCarDriver();
  31. }
  32. public class BMWCarDriver implements IDriver{
  33. public IBusinessCar BusinessCarDriver(){
  34. return new BMWBusinessCar();
  35. }
  36. public ISportCar SportCarDriver(){
  37. return new BMWSportCar();
  38. }
  39. }
  40. public class BenzCarDriver implements IDriver{
  41. public BenzBusinessCar BusinessCarDriver(){
  42. return new BenzBusinessCar();
  43. }
  44. public BMWSportCar SportCarDriver(){
  45. return new BMWSportCar();
  46. }
  47. }
  48. public class client{
  49. public static void main(String[] args){
  50. IDriver myDriver = new BenzCarDriver();
  51. Icar myCar = myDriver.SportCarDriver();
  52. myCar.run();
  53. }
  54. }

心得:抽象方法似乎达到了完美境界.把开奔驰的司机和开宝马的司机的公共方法抽象出来,并对不同的司机创建不同的类,到时候不管是开什么车的司机随你添加.它们唯一的共同点都是开车.

PS. 我的设计模式系列blog,《设计模式》专栏,通过简单的示例演示设计模式,对于初学者很容易理解入门。深入学习请看GoF的《设计模式》。

设计模式:工厂方法与抽象工厂模式相关推荐

  1. 设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)

    工厂模式 Factory Pattern(简单工厂.工厂方法.抽象工厂) 工厂模式-创建型模式-提供了创建对象的最佳方式. 在工厂模式中,创建对象时不会对客户端暴露创建逻辑,并且是通过一个共同的接口来 ...

  2. 设计模式:简单工厂、工厂方法、抽象工厂之小结与区别

    简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式.其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性. 本文是本人对这三种模式学习后的一个小结以及对他 ...

  3. 【设计模式实战】简单工厂、工厂方法、抽象工厂:原理篇

    小明开发的应用,经常要从XML或者Asset中读取省市区数据. 小明是这样写的: public abstract class IOHandler {/*** 添加*/public abstract v ...

  4. 23招做项目——工厂模式:工厂方法和抽象工厂

    在网上的大多数资料里面,将工厂模式分为:简单工厂.工厂方法.抽象工厂,他们之间的联系(以电子厂为例)如下: 那么该文章首先讲解工厂模式是什么,为什么需要工厂模式,最后再对三种模式进行示例.该文章是23 ...

  5. Android工厂设计模式(简单工厂,工厂方法,抽象工厂,BitmapFactory简单工厂分析,Retrofit抽象工厂分析)

    文章目录 创建型设计模式(简单工厂,工厂方法,抽象工厂) 一.简单工厂模式 引出简单工厂模式 二.工厂方法模式 三.抽象工厂模式 Android源码中用到的工厂模式举例 一.BitmapFactory ...

  6. 设计模式——简单工厂、工厂方法和抽象工厂的区别与联系

    前言 创建型模式中,常用的有工厂方法模式和抽象工厂模式,平时实践还包括简单工厂模式,虽然简单工厂模式不在23种设计模式中. 为了区分以上几种设计模式的差别,通过以下几个例子介绍这几种模式的使用场景以及 ...

  7. java 抽象工厂工厂_Java设计模式之简单工厂、工厂方法和抽象工厂

    学习Java的同学注意了!!! 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:456544752我们一起学Java! 在前面的学习中(参见前面的博客),我们学到了很 ...

  8. 每周一个设计模式之工厂方法与抽象工厂

    工厂方法模式与抽象工厂模式,两个模式比较相似,把任何一个独立出来,好像都不太好,所以把它们放到一起来理解会更好.不管是工厂方法还是抽象工厂,都有三个要素,那就是Client,Factory,Produ ...

  9. 工厂模式(简单工厂,工厂方法,抽象工厂)

    工厂顾名思义就是创建产品,工厂分为三种:简单工厂,工厂方法,抽象工厂.该模式用于封装和管理对象的创建,是一种创建型模式. 1)简单工厂 该模式通过向工厂传递类型来指定要创建的对象 提供一个方法,根据类 ...

最新文章

  1. 《看透springmvc源码分析与实践》读书笔记二
  2. javaweb设置servlet
  3. 管线命令 cut grep
  4. PAT甲级1019 General Palindromic Number:[C++题解]进制位、回文数、vector来做
  5. ReentrantLock实现原理深入探究
  6. git的简单操作命令
  7. 直播预告 | 小米人工智能部崔世起:小爱同学全双工技术实践
  8. linux 中安装 JDK
  9. 【大会】声音叫醒耳朵,语音连接网络
  10. 怎么运行verilog语言_(六) Verilog入门之有限状态机
  11. php 获取音视频时长,PHP 利用getid3 获取音频文件时长等数据
  12. html字数统计,html页面字数统计
  13. 北大美女辞去公司副总职务创业养狗
  14. php版本高无法删除栏目,phpcms不能删除栏目怎么办
  15. 提交百度快速收录真的能达到秒收录吗
  16. div+css三栏式布局
  17. 这是属于你我平凡人的荣耀
  18. 软件测试是干什么的 什么样的人才能够当软件测试员?
  19. 2012 CSP-S 初赛 答案解析
  20. Failed to connect to github.com port 443: Timed out 及 ping github.com请求超时

热门文章

  1. 爬虫从入门到精通(16) |最详细的的Fiddler抓包软件介绍
  2. CST微波工作室学习笔记—5.设计建模基本操作2
  3. Android实现文字垂直滚动
  4. 现代化小区建筑规划设计的问题
  5. 华为AI计算机,华为在人工智能行业的发展
  6. 使用jquery制作漂亮相册集
  7. linux 版本介绍
  8. 入门篇-华为云分布式数据库中间件(DDM)创建逻辑库和逻辑表
  9. 【深度学习篇】---CNN和RNN结合与对比,实例讲解
  10. vue移动端表格吸顶、行自适应高度、列左侧固定悬浮