对于简单工厂来说,它的工厂只能是这个样子的

public class SimplyFactory { 

/**

* 静态工厂方法

*/

public static Prouct factory(String which) throw NoSuchProductExcption





   if(which.equalIgnoreCase("product1"))

   { 

   return new Product1();

    }

   else if(which.equalsIgnoreCase("product2"))

      {   

        return new Product2(); 

       }

  else if(which.equalsIgnoreCase("product3"))

      {   

        return new Product3(); 

       }

  else throw  NoSuchProductExcption("NoSuchProduct");

   }

  }

}



而对产品Product1,Product2,Product3,可以执行接口Product,也可以不执行接口Product(当然这样不好),这个Product接口只是用来抽象具体product用的



public interface Product



  void productMethod1();     //这些只是

  void productMethod2();

  void productMethod3();

}

对工厂来说,只要有这么一种产品,一般来说就要在工厂里有它的生产的方法, 否则抛出异常,而要工厂生产的话,也必须下达生产什么产品的命令,至少要向工厂发出信号,让工厂足以区分是要生产什么产品,否则工厂是不知道生产哪一种产品,

对于简单工厂来说,就是需要在工厂中枚举所有的产品,所以说简单工厂还是非常笨的。 





if(which.equalIgnoreCase("product1"))     只是用来区分生产什么产品的标记值,(也可以根据产品其它属性来 判断,比如产品类型,产品大小,总之能够区分是什么产品的属性,或者是与产品属性相关的变量)    或者说标记值是A,生产A产品,或者工厂里定义不是 这样的,我偏偏要生产B产品,或者再特殊一些,我偏偏要生产A产品+B产品,那么就要 return new ProductA()+new ProductB()了。



这样,我们就可以看出一个问题来,如果要能够被简单工厂生产出来,就必须在简单工厂中有能够生产出的它的方法定义,当然还需要有这个具体产品类的定义,就 是有class对应,这样确保在简单工厂中new 它的时候不会抛出 NoSuchProduct的Exception.





对于工厂方法来说

实质上它是让工厂实现了抽象的工厂接口,它把具体怎么生产一种东西,放在具体的工厂去实现了,所谓”延迟到子类中实现“

public interface Creator



  public Prouct factory();

}



public SubCreator1 implent Creator



   public Prouct factory()

  { 

   return new ConcreteProduct1();

   }

}



public SubCreator2 implent Creator



   public Prouct factory()

  { 

    return new ConcreteProduct2();

   }

}

请注意:返回类型是Product型的!!

这样客户端调用是直接new 一个具体工厂的实例,然后命令它去生产,而对于具体工厂的父类(既工厂接口,接口完全可以改成子类继承父类来实现,只是这样不好,不符合OO的原则),它完全不知道什么产品被生产了,甚至它连那个具体工厂被实例化它都不知道



抽象工厂模式 

抽象工厂模式意图是“提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类”或为特定的客户(或情况)提供特定系列的对象。



public interface Creator



   public ProuctA factoryA();

   public ProuctB factoryB();

}



public interface ProductA     //ProductA 接口



}



public interface ProductB     //ProductB 接口



}





public class ConCreator1 implent Creator



   public ProuctA factoryA()

  { 

   return new ConcreteProductA1();

   }



   public ProuctB factoryB()

  { 

   return new ConcreteProductB1();

   }

}



public class ConCreator2 implent Creator



   public ProuctA factoryA()

   { 

    return new ProductA2();

    }



   public ProuctB factoryB()

   { 

   return new ProductB2();

    }

}





public class ProductA1 implements  ProductA



 public  ProductA1()

   { 

    }

}

public class ProductA2 implements  ProductA



 public  ProductA2()

   { 

    }

}

public class ProductB1 implements  ProductB



 public  ProductB1()

   { 

    }

}

public class ProductB2 implements  ProductB



 public  ProductB2()

   { 

    }

}

实际上是这样的

1,两个工厂类ConCreator1,ConCreator2都实现了Creator接口

2,ProuctA1,ProductA2都实现了ProductA接口

3,ProuctB1,ProductB2都实现了ProductB接口

4,ConCreator1负责生产ProductA类型的产品(包括ProductA1,ProductB1)

5,ConCreator2负责生产ProductB类型的产品(包括ProductA2,ProductB2)

6,工厂方法也有这样的特征,也就是说Creator不知道什么被生产出来,甚至不知道ConCreator1还是ConCreator2被实例化了,因 为client高兴调那一个工厂,就调那一个工厂,就是说工厂能生产什么,对客户端是可见的。甚至还有一种情况,客户端高兴起来就生产了 ProductA1,我就不生产ProductA2,因为上面的例子中它们还都是松散的,没有绑定在一起
----------------------------总结----------------------------



工厂方法模式:

一个抽象产品类,可以派生出多个具体产品类。   

一个抽象工厂类,可以派生出多个具体工厂类。   

每个具体工厂类只能创建一个具体产品类的实例。



抽象工厂模式:

多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。   

一个抽象工厂类,可以派生出多个具体工厂类。   

每个具体工厂类可以创建多个具体产品类的实例。   

    

区别:

工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。   

工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。

简单工厂,Factory Method(工厂方法)和Abstract Factory(抽象工厂)模式的更多相关文章

  1. "Simple Factory" vs "Factory Method" vs "Abstract Factory" vs "Reflect"

    ref: http://www.cnblogs.com/zhangchenliang/p/3700820.html 1. "Simple Factory" package torv ...

  2. Simple Factory vs. Factory Method vs. Abstract Factory【简单工厂,工厂方法以及抽象工厂的比较】

    I ran into a question on stackoverflow the other day that sort of shocked me. It was a piece of code ...

  3. 设计模式(3)抽象工厂模式(Abstract Factory)

    设计模式(0)简单工厂模式 设计模式(1)单例模式(Singleton) 设计模式(2)工厂方法模式(Factory Method) 源码地址 0 抽象工厂模式简介 0.0 抽象工厂模式定义 抽象工厂 ...

  4. 设计模式之美:Abstract Factory(抽象工厂)

    索引 别名 意图 结构 参与者 适用性 缺点 效果 相关模式 命名约定 实现 实现方式(一):使用 Factory Method 来实现 Abstract Factory. 实现方式(二):使用 Pr ...

  5. 抽象工厂(Abstract Factory),工厂方法(Factory Method),单例模式(Singleton Pattern)

    在谈工厂之前,先阐述一个观点:那就是在实际程序设计中,为了设计灵活的多态代码,代码中尽量不使用new去实例化一个对象,那么不使用new去实例化对象,剩下可用的方法就可以选择使用工厂方法,原型复制等去实 ...

  6. 深入浅出设计模式——工厂方法模式(Factory Method)

    介绍在简单工厂模式中,我们提到,工厂方法模式是简单工厂模式的一个延伸,它属于Gof23中设计模式的创建型设计模式.它解决的仍然是软件设计中与创建对象有关的问题.它可以更好的处理客户的需求变化. 引入我 ...

  7. 工厂方法模式(FACTORY METHOD)

    核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦.复用和方便后期维护拓展的目的. 工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接 ...

  8. 创建类模式(一):工厂方法(Factory Method)

    定义 此模式的核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦.复用和方便后期维护拓展的目的. 定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中.核心 ...

  9. 设计模式——工厂方法模式(Factory Method)

    原文地址:http://www.cnblogs.com/Bobby0322/p/4179921.html 介绍 在简单工厂模式中,我们提到,工厂方法模式是简单工厂模式的一个延伸,它属于Gof23中设计 ...

  10. 设计模式之工厂方法模式(Factory Method Pattern)

    一.工厂方法模式的诞生 在读这篇文章之前,我先推荐大家读<设计模式之简单工厂模式(Simple Factory Pattern)>这篇文档.工厂方法模式是针对简单工厂模式中违反开闭原则的不 ...

随机推荐

  1. Android初级教程进程间的通信AIDL

    在介绍跨程序进程间通信AIDL前,先看一下本程序activity与某个服务是怎么绑定在一起进行交互的. 需求:服务有两个方法.分别是播放音乐与停止播放音乐.该程序的活动要访问这两个方法,在activi ...

  2. 【UNIX环境高级编程】文件 IO 操作 一 ( open | close | creat | lseek | write | read )

    博客地址 : http://blog.csdn.net/shulianghan/article/details/46980271 一. 文件打开关闭操作相关函数介绍 1. open 函数 (1) op ...

  3. Objc中触摸处理阻塞时消息派送的问题

    在游戏场景中添加了touchBegan的处理: -(void)touchBegan:(CCTouch *)touch withEvent:(CCTouchEvent *)event{ if ([sel ...

  4. [GitHub]第六讲:开源项目贡献流程

    Github 是目前世界上最大的开源项目的托管交流平台.贡献开源项目的流程也是 Github 全力支持的,也一样是遵循 Github Flow,虽然跟前面团队合作流程会有一点差别.在团队内部,大家都是 ...

  5. [Redmine] Centos5上安装Redmine3.0+nginx+thin部署

    项目管理的需要所以安装Redmine,其实wiki放在上面也不错的. 首先是安装,ruby应用第一次装,把坑记住. nginx, mysql是已经安装好的,只需要配置, 结合nginx的部署方式很多, ...

  6. XStream

     1.引入需要的jar包,在pom.xml中配置依赖 <dependency> <groupId>com.thoughtworks.xstream</groupId& ...

  7. iOS中 Swift初级入门学习(三)

    // // main.swift // LessonSwift-03 // // Copyright (c) 2015年 韩俊强. All rights reserved. // import Fou ...

  8. 自己动手写hibernate

    这篇文章 可作为北京尚学堂 hibernate的学习笔记 再学习hibernate之前 得有一点反射的基础知识 package com.bjsxt.hibernate; public class St ...

  9. 一致性Hash算法介绍(分布式环境算法)

    32的整数环(这个环被称作一致性Hash环),根据节点名称的Hash值(其分布范围同样为0~232)将节点放置在这个Hash 环上.然后根据KEY值计算得到其Hash值(其分布范围也同样为0~232  ...

  10. hadoop集群崩溃,因为tmp下/tmp/hadoop-hadoop/dfs/name文件误删除

    hadoop执行start-all后,显示正常启动. starting namenode, logging to /opt/hadoop-0.20.2-cdh3u0/logs/hadoop-hadoo ...