在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的。但是在一些情况下, new操作符直接生成对象会带来一些问题。举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象。 在这些情况,新对象的建立就是一个 “过程”,不仅是一个操作,像一部大机器中的一个齿轮传动。

模式的问题:你如何能轻松方便地构造对象实例,而不必关心构造对象实例的细节和复杂过程呢?

解决方案:建立一个工厂来创建对象

实现:

一、引言
    1)还没有工厂时代:假如还没有工业革命,如果一个客户要一款宝马车,一般的做法是客户去创建一款宝马车,然后拿来用。
    2)简单工厂模式:后来出现工业革命。用户不用去创建宝马车。因为客户有一个工厂来帮他创建宝马.想要什么车,这个工厂就可以建。比如想要320i系列车。工厂就创建这个系列的车。即工厂可以创建产品。
    3)工厂方法模式时代:为了满足客户,宝马车系列越来越多,如320i,523i,30li等系列一个工厂无法创建所有的宝马系列。于是由单独分出来多个具体的工厂。每个具体工厂创建一种系列。即具体工厂类只能创建一个具体产品。但是宝马工厂还是个抽象。你需要指定某个具体的工厂才能生产车出来。

4)抽象工厂模式时代:随着客户的要求越来越高,宝马车必须配置空调。于是这个工厂开始生产宝马车和需要的空调。

最终是客户只要对宝马的销售员说:我要523i空调车,销售员就直接给他523i空调车了。而不用自己去创建523i空调车宝马车.

这就是工厂模式。

二、分类 
        工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。 
工厂模式可以分为三类:

1)简单工厂模式(Simple Factory) 
2)工厂方法模式(Factory Method) 
3)抽象工厂模式(Abstract Factory)

这三种模式从上到下逐步抽象,并且更具一般性。 
        GOF在《设计模式》一书中将工厂模式分为两类:工厂方法模式(Factory Method)与抽象工厂模式(Abstract Factory)。

将简单工厂模式(Simple Factory)看为工厂方法模式的一种特例,两者归为一类。

三、区别 
工厂方法模式:
一个抽象产品类,可以派生出多个具体产品类。   
一个抽象工厂类,可以派生出多个具体工厂类。   
每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式:
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。   
一个抽象工厂类,可以派生出多个具体工厂类。   
每个具体工厂类可以创建多个具体产品类的实例。   
区别:
工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。   
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
两者皆可。

四、简单工厂模式 
建立一个工厂(一个函数或一个类方法)来制造新的对象。
分布说明引子:从无到有。客户自己创建宝马车,然后拿来用。

[java] view plaincopy print?
  1. public class BMW320 {
  2. public BMW320(){
  3. System.out.println("制造-->BMW320");
  4. }
  5. }
  6. public class BMW523 {
  7. public BMW523(){
  8. System.out.println("制造-->BMW523");
  9. }
  10. }
  11. public class Customer {
  12. public static void main(String[] args) {
  13. BMW320 bmw320 = new BMW320();
  14. BMW523 bmw523 = new BMW523();
  15. }
  16. }

客户需要知道怎么去创建一款车,客户和车就紧密耦合在一起了.为了降低耦合,就出现了工厂类,把创建宝马的操作细节都放到了工厂里面去,客户直接使用工厂的创建工厂方法,传入想要的宝马车型号就行了,而不必去知道创建的细节.这就是工业革命了:简单工厂模式

即我们建立一个工厂类方法来制造新的对象。如图:

产品类:

[java] view plaincopy print?
  1. abstract class BMW {
  2. public BMW(){
  3. }
  4. }
  5. public class BMW320 extends BMW {
  6. public BMW320() {
  7. System.out.println("制造-->BMW320");
  8. }
  9. }
  10. public class BMW523 extends BMW{
  11. public BMW523(){
  12. System.out.println("制造-->BMW523");
  13. }
  14. }

工厂类:

[java] view plaincopy print?
  1. public class Factory {
  2. public BMW createBMW(int type) {
  3. switch (type) {
  4. case 320:
  5. return new BMW320();
  6. case 523:
  7. return new BMW523();
  8. default:
  9. break;
  10. }
  11. return null;
  12. }
  13. }

客户类:

[java] view plaincopy print?
  1. public class Customer {
  2. public static void main(String[] args) {
  3. Factory factory = new Factory();
  4. BMW bmw320 = factory.createBMW(320);
  5. BMW bmw523 = factory.createBMW(523);
  6. }
  7. }

简单工厂模式又称静态工厂方法模式。重命名上就可以看出这个模式一定很简单。它存在的目的很简单:定义一个用于创建对象的接口。 
      先来看看它的组成: 
         1) 工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑,用来创建产品
         2) 抽象产品角色:它一般是具体产品继承的父类或者实现的接口。         
         3) 具体产品角色:工厂类所创建的对象就是此角色的实例。在Java中由一个具体类实现。 
        
        下面我们从开闭原则(对扩展开放;对修改封闭)上来分析下简单工厂模式。当客户不再满足现有的车型号的时候,想要一种速度快的新型车,只要这种车符合抽象产品制定的合同,那么只要通知工厂类知道就可以被客户使用了。所以对产品部分来说,它是符合开闭原则的;但是工厂部分好像不太理想,因为每增加一种新型车,都要在工厂类中增加相应的创建业务逻辑(createBMW(int type)方法需要新增case),这显然是违背开闭原则的。可想而知对于新产品的加入,工厂类是很被动的。对于这样的工厂类,我们称它为全能类或者上帝类。 
        我们举的例子是最简单的情况,而在实际应用中,很可能产品是一个多层次的树状结构。由于简单工厂模式中只有一个工厂类来对应这些产品,所以这可能会把我们的上帝累坏了,也累坏了我们这些程序员。
        于是工厂方法模式作为救世主出现了。 工厂类定义成了接口,而每新增的车种类型,就增加该车种类型对应工厂类的实现,这样工厂的设计就可以扩展了,而不必去修改原来的代码。
五、工厂方法模式 
        工厂方法模式去掉了简单工厂模式中工厂方法的静态属性,使得它可以被子类继承。这样在简单工厂模式里集中在工厂方法上的压力可以由工厂方法模式里不同的工厂子类来分担。 
工厂方法模式组成: 
       1)抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。 
       2)具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。 
       3)抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。 
       4)具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。 
       工厂方法模式使用继承自抽象工厂角色的多个子类来代替简单工厂模式中的“上帝类”。正如上面所说,这样便分担了对象承受的压力;而且这样使得结构变得灵活 起来——当有新的产品产生时,只要按照抽象产品角色、抽象工厂角色提供的合同来生成,那么就可以被客户使用,而不必去修改任何已有 的代码。可以看出工厂角色的结构也是符合开闭原则的!

代码如下:

产品类:

[java] view plaincopy print?
  1. abstract class BMW {
  2. public BMW(){
  3. }
  4. }
  5. public class BMW320 extends BMW {
  6. public BMW320() {
  7. System.out.println("制造-->BMW320");
  8. }
  9. }
  10. public class BMW523 extends BMW{
  11. public BMW523(){
  12. System.out.println("制造-->BMW523");
  13. }
  14. }

创建工厂类:

[java] view plaincopy print?
  1. interface FactoryBMW {
  2. BMW createBMW();
  3. }
  4. public class FactoryBMW320 implements FactoryBMW{
  5. @Override
  6. public BMW320 createBMW() {
  7. return new BMW320();
  8. }
  9. }
  10. public class FactoryBMW523 implements FactoryBMW {
  11. @Override
  12. public BMW523 createBMW() {
  13. return new BMW523();
  14. }
  15. }

客户类:

[java] view plaincopy print?
  1. public class Customer {
  2. public static void main(String[] args) {
  3. FactoryBMW320 factoryBMW320 = new FactoryBMW320();
  4. BMW320 bmw320 = factoryBMW320.createBMW();
  5. FactoryBMW523 factoryBMW523 = new FactoryBMW523();
  6. BMW523 bmw523 = factoryBMW523.createBMW();
  7. }
  8. }

工厂方法模式仿佛已经很完美的对对象的创建进行了包装,使得客户程序中仅仅处理抽象产品角色提供的接口,但使得对象的数量成倍增长。当产品种类非常多时,会出现大量的与之对应的工厂对象,这不是我们所希望的。

参考http://blog.csdn.NET/hguisu/article/details/7505909

以上就是简单工厂模式,工厂方法模式,抽象工厂模式在这里。

微博:http://weibo.com/2553717707

博客:http://blog.csdn.net/jason0539(转载请说明出处)

简单工厂模式+工厂方法模式相关推荐

  1. 设计模式之工厂类模式总结对比、简单工厂模式、工厂方法模式、抽象工厂模式、带反射的工厂模式、例子代码分析、最详细

    1. 题目 假设某公司同时用SqlServer.MySql数据库,即会切换两数据库(不同数据库的sql语句有些许差异),同时,两数据库里均有对Users.Departments表的操作(sql代码不一 ...

  2. 简单工厂模式、工厂方法模式、抽象工厂模式 之间的对比

    先看各自的结构: 简单工厂模式(SimpleFactory Mode): 简单工厂模式的思路是,首先我们把一些共性的东西(算法)拿出来,进行抽象,比如加减乘除.然后我们在定义一个类作为工厂类,工厂类的 ...

  3. 4、简单工厂模式,工厂方法模式,

    1.工厂模式定义                                             简单工厂模式:用一个单独的类来做这个创造实力的过程,这就是工厂. 工厂方法模式:定义一个用于创 ...

  4. 简单工厂模式与工厂方法模式

    在OO设计领域,我们知道前人总结了不少的经验,许多的经验在现代软件工程过程中已经被认为是原则来遵守.下面笔者摘抄几项下文涉及到的OO原则的定义. OCP(开闭原则,Open-Closed Princi ...

  5. 工厂方法模式和简单工厂模式的区别

    简单工厂模式 就我们的计算器例子来说,简单工厂模式的思想就是,创建一个运算类,创建一个简单工厂类. 运算类派生加法类.减法类.乘法类...... 简单工厂类主要是根据传入的符号字符串,做相应的条件判断 ...

  6. 最简单java设计模式:工厂方法模式

    前言 在前一篇文章讲解了一下简单工厂模式,在上篇文章中,我们也讲到了简单工厂模式的缺点,就是不满足开闭原则,这对于软件的设计来说,是不太好的,而下面讲解的工厂方法模式,正是为了弥补简单工厂模式的缺点, ...

  7. 简单工厂模式,工厂方法模式,抽象工厂模式,spring的狂想

    菜鸟D在项目中遇见一个比较纠结的高耦合,所以就想办法来解耦.情况是这样的:系统通过用户选择treeview控件的节点判断调用不同的处理,这些处理中某些东西又是类似的.同事的建议是采用简单工厂,耦合就耦 ...

  8. Java设计模式之(工厂模式)--简单工厂模式--工厂方法模式--抽象工厂模式

    工厂模式: 工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂方法模式(Factory Method) 3)抽象工厂模式(Abstract Factory) 简单工厂模 ...

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

    简单工厂模式 从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决 ...

  10. [设计模式]简单工厂和工厂方法模式适用场景

    简单工厂模式 适用场景: 1.工厂类负责创建的对象比较少,由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂. 2.客户端只知道传入工厂类的参数,对于如何创建对象并不关心. 工厂方法模式 适用场 ...

最新文章

  1. java bag集合_集合基于数组的实现:ArrayBag.java
  2. 怎么将两个list集合按照条件合成一个list
  3. xp定时关机软件_好用又免费的电脑定时工具,不用得后悔
  4. 宿迁学计算机的学校,宿迁计算机学校
  5. 归并排序(Merge Sort)思想,代码实现
  6. JAVA 算法练习(一)
  7. javacpp-FFmpeg系列之2:通用拉流解码器,支持视频拉流解码并转换为YUV、BGR24或RGB24等图像像素数据...
  8. U-mail邮件系统对故障的紧急措施有哪些?
  9. 3. jQuery 选择器
  10. 批处理脚本一键重置mysql的root密码
  11. 基于Centos 8的moodle安装
  12. 51单片机学习制作定时闹钟及《花海》演奏
  13. indesign用于产品排班_InDesign排版:设计师的基本印刷知识
  14. 有关微型计算机控制系统的论文,计算机控制系统 徐文尚
  15. syslinux引导硬盘linux,使用SysLinux引导Linux系统
  16. 游戏开发学习路线(需要学什么)
  17. 安装mysql提示oxc000007b_重装win7系统黑屏提示oxc000007b怎么办
  18. ajax header请求,如何在用户登陆之后给每个页面往后台的ajax请求header都带上
  19. 源码分享 | 一套高质量个人主页
  20. 7000字用户画像技术及方法论

热门文章

  1. Error: Java heap space
  2. 《Windows PowerShell实战指南(第2版)》——1.4 搭建自己的实验环境
  3. PHP中面向对象的图片处理类
  4. iOS开发出错whose view is not in the window hierarchy!的解决
  5. 〖Linux〗Kubuntu设置打开应用时就只在打开时的工作区显示
  6. C#求数组中元素的全排列
  7. linux ssh密钥登录配置
  8. 在不使用{}时,else执行到哪里结束
  9. 链表(Linked List)之环形链表
  10. 执行Hive的查询语句报错:java.lang.IllegalArgumentException: Does not contain a valid host:port authority: loca