工厂模式:

工厂模式可以分为三类:

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

简单工厂模式

插头 分为二孔插头和三孔插头。
首先 创建插头产品类 Pin

public class Pin {
  protected String PinType;
}

然后分别创建二孔插头和三孔插头类

/**
* @author hjn
*二孔插头类
*/
public class PinTw extends Pin {
  private String PinType;   public String getPinType() {
    return PinType;
  }   public void setPinType(String pinType) {
    PinType = pinType;
  }   public PinTw() {
    System.out.println("I am 2孔 Pin");
  }
} /**
* @author hjn
*三孔插头类
*/
public class PinTh extends Pin {
  private String PinType;   public String getPinType() {
    return PinType;
  }
  public void setPinType(String pinType) {
    PinType = pinType;
  }   public PinTh() {
    System.out.println("I am 3孔 Pin");
  }
}

然后创建插头工厂类

/**
* @author hjn
*插头工厂类
*/
public class PinFactory {
  /**
  * @param type
  * @return
  * 根据插头数返回相对的插头对象
  */
  public static Pin creatPin(int type) {
    switch (type) {
    case 2:
      return new PinTw();     case 3:
      return new PinTh();
    default:
    break;
    }
    return null;
  }
}

最后 测试类 :

public class TestPin {

    public static void main(String[] args) {
Pin pinth = PinFactory.creatPin(3);
Pin pintw = PinFactory.creatPin(2);
}
}

这就是简单工厂模式。

简单工厂模式又称静态工厂方法模式。重命名上就可以看出这个模式一定很简单。它存在的目的很简单:定义一个用于创建对象的接口。 
先来看看它的组成: 
1) 工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑,用来创建产品
2) 抽象产品角色:它一般是具体产品继承的父类或者实现的接口。 
3) 具体产品角色:工厂类所创建的对象就是此角色的实例。在Java中由一个具体类实现。

下面我们从开闭原则(对扩展开放;对修改封闭)上来分析下简单工厂模式。当客户不再满足现有的插头型号的时候,想要一种更多头的新型插头,只要这种插头符合抽象产品制定的合同,那么只要通知工厂类知道就可以被客户使用了。所以对产品部分来说,它是符合开闭原则的;但是工厂部分好像不太理想,因为每增加一种新型插头,都要在工厂类中增加相应的创建业务逻辑(creatPin(int type)方法需要新增case),这显然是违背开闭原则的。可想而知对于新产品的加入,工厂类是很被动的。对于这样的工厂类,我们称它为全能类或者上帝类。 
我们举的例子是最简单的情况,而在实际应用中,很可能产品是一个多层次的树状结构。由于简单工厂模式中只有一个工厂类来对应这些产品,所以这可能会把我们的上帝累坏了,也累坏了我们这些程序员。
于是工厂方法模式作为救世主出现了。 工厂类定义成了接口,而每新增的插头种类型,就增加该插头种类型对应工厂类的实现,这样工厂的设计就可以扩展了,而不必去修改原来的代码。

简单工厂模式的优缺点 
 优点:客户端不需要修改代码。
 缺点: 当需要增加新的运算类的时候,不仅需新加运算类,还要修改工厂类,违反了开闭原则。

工厂方法模式

工厂方法模式去掉了简单工厂模式中工厂方法的静态属性,使得它可以被子类继承。这样在简单工厂模式里集中在工厂方法上的压力可以由工厂方法模式里不同的工厂子类来分担。 
工厂方法模式组成: 
1)抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。 
2)具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。 
3)抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。 
4)具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。 
工厂方法模式使用继承自抽象工厂角色的多个子类来代替简单工厂模式中的“上帝类”。正如上面所说,这样便分担了对象承受的压力;而且这样使得结构变得灵活 起来——当有新的产品产生时,只要按照抽象产品角色、抽象工厂角色提供的合同来生成,那么就可以被客户使用,而不必去修改任何已有 的代码。可以看出工厂角色的结构也是符合开闭原则的!

首先 创建插头产品类 Pin

public class Pin {
protected String PinType;
}

然后分别创建二孔插头和三孔插头类

/**
* @author hjn
*二孔插头类
*/
public class PinTw extends Pin {
  private String PinType;   public String getPinType() {
    return PinType;
  }   public void setPinType(String pinType) {
    PinType = pinType;
  }   public PinTw() {
    System.out.println("I am 2孔 Pin");
  }
} /**
* @author hjn
*三孔插头类
*/
public class PinTh extends Pin {
  private String PinType;   public String getPinType() {
    return PinType;
  }   public void setPinType(String pinType) {
    PinType = pinType;
  }   public PinTh() {
    System.out.println("I am 3孔 Pin");
  }
}

然后创建插头工厂接口:

/**
* @author hjn
* 工厂方法接口*
*/
public interface IPinFactory {
  public Pin creatPin(); }

然后创建 二孔插头和三孔插头的工厂

/**
* @author hjn
*二孔的工厂类
*/
public class PinTwFactory implements IPinFactory {   Pin ptw=new PinTw();
  public Pin creatPin() {
    return ptw;
  }
} /**
* @author hjn
*三孔的工厂类
*/
public class PinThFactory implements IPinFactory {   Pin pth=new PinTh();
  public Pin creatPin() {
    return pth;
  }
}

测试类 :

public class TestPin {

  public static void main(String[] args) {
    PinThFactory pthf =new PinThFactory();
    Pin pinth = pthf.creatPin();
    PinTwFactory ptwf=new PinTwFactory();
    Pin pintw = ptwf.creatPin();
  }
}

这个和简单工厂有区别,简单工厂模式只有一个工厂,工厂方法模式对每一个产品都有相应的工厂,当产品种类非常多时,会出现大量的与之对应的工厂对象,这不是我们所希望的。

  好处:增加一个运算类(例如N次方类),只需要增加运算类和相对应的工厂,两个类,不需要修改工厂类。
  缺点:增加运算类,会修改客户端代码,工厂方法只是把简单工厂的内部逻辑判断移到了客户端进行。

抽象工厂模式

首先 创建插头产品类 Pin

public class Pin {
  protected String PinType;
}

然后分别创建二孔插头和三孔插头类

/**
* @author hjn
*二孔插头类
*/
public class PinTw extends Pin {
  private String PinType;   public String getPinType() {
    return PinType;
  }   public void setPinType(String pinType) {
    PinType = pinType;
  }   public PinTw() {
    System.out.println("I am 2孔 Pin");
  }
}

/**
* @author hjn
*三孔插头类
*/
public class PinTh extends Pin {
  private String PinType;   public String getPinType() {
    return PinType;
  }   public void setPinType(String pinType) {
    PinType = pinType;
  }   public PinTh() {
    System.out.println("I am 3孔 Pin");
  }
}

然后创建插头工厂接口:

/**
* @author hjn
* 工厂方法接口*
*/
public interface IPinFactory {
  public Pin creatPinTw();
  public Pin creatPinTh();
} /**
* @author hjn
*Pin工厂实现类
*/
public class PinFactoryImpl implements IPinFactory {   @Override
  public Pin creatPinTw() {
    return new PinTw();
  }   @Override
    public Pin creatPinTh() {
  return new PinTh();
  } }

测试类

public class TestPin {
  public static void main(String[] args) {
    PinFactoryImpl pin = new PinFactoryImpl();
    Pin ptw = pin.creatPinTw();
    Pin pth = pin.creatPinTh();
  }
}

 抽象工厂模式,一个具体工厂可以制造几个产品

优点:易于交换产品系列,例如Access和SQLServer数据库之间切换。
  缺点:如果需要增加新的产品树,那么就要新增三个产品类,并且要修改三个工厂类。这样大批量的改动是很丑陋的做法。

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

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

Java设计模式之(工厂模式)的更多相关文章

  1. 浅析JAVA设计模式之工厂模式(一)

    1 工厂模式简单介绍 工厂模式的定义:简单地说,用来实例化对象,取代new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ...

  2. Java设计模式之工厂模式(Factory模式)介绍(转载)

    原文见:http://www.jb51.net/article/62068.htm 这篇文章主要介绍了Java设计模式之工厂模式(Factory模式)介绍,本文讲解了为何使用工厂模式.工厂方法.抽象工 ...

  3. Java 设计模式之工厂模式(二)

    原文地址:Java 设计模式之工厂模式(二) 博客地址:http://www.extlight.com 一.背景 本篇内容是 Java 设计模式创建型模式的第二篇.上一篇主题为 <Java 设计 ...

  4. 浅析JAVA设计模式之工厂模式(二)

    1 工厂方法模式简单介绍 工厂方法 (Factroy Method)模式:又称多态性工厂模式(Polymorphic Factory),在这样的模式中,核心工厂不再是一个详细的类.而是一个抽象工厂,提 ...

  5. java设计模式2————工厂模式

    1.工厂模式介绍: 1.1.实现了创建者与调用者的分离 1.2.详细分类: 简单工厂模式 工厂方法模式 抽象工厂模式 1.3.所遵循的OOP原则: 开闭原则:对扩展开放,对修改关闭 依赖倒转原则:面向 ...

  6. java 设计模式之工厂模式与反射的结合

    工厂模式: /**  * @author Rollen-Holt 设计模式之 工厂模式  */   interface fruit{     public abstract void eat(); } ...

  7. JAVA设计模式--抽象工厂模式

    抽象工厂设计模式 1.系统中有多个产品族,而系统一次只可能消费其中一族产品2.同属于同一个产品族的产品以其使用.来看看抽象工厂模式的各个角色(和工厂方法的如出一辙):抽象工厂角色: 这是工厂方法模式的 ...

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

    一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类:1)简单工厂模式(Simple Factor ...

  9. Java设计模式之工厂模式(简单工厂模式+工厂方法模式)

    摘自http://blog.csdn.net/jason0539/article/details/23020989 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是 ...

  10. java设计模式之一工厂模式

    简单工厂模式是java设计模式中最简单的设计模式之一: 工厂模式是最常用的设计模式之一. 工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模 ...

随机推荐

  1. Asp.Net MVC中捕捉错误路由并设置默认Not Found页面。

    在Global中写一个Application_Error捕捉错误路由并重定向到Not Found页面.这里是全局性抓取错误路由,此处还可以写由错误路由导致访问失败的日志记录. protected vo ...

  2. logging日志过滤和日志文件自动截取

    1.日志过滤 import logging class IgnoreFilter(logging.Filter): def filter(self,record): return "girl ...

  3. UML建模图实战笔记

    一.前言 UML:Unified Modeling Language(统一建模语言),使用UML进行建模的作用有哪些: 可以更好的理解问题 可以及早的发现错误或者被遗漏的点 可以更加方便的进行组员之间 ...

  4. 《Python基础教程》 读书笔记 第五章(下)循环语句

    5.5.1while循环 x=1 while x<=100: print x x+=1 确保用户输入了名字: name="" while not name: name=raw ...

  5. Linux系统使用iftop查看带宽占用情况

    Linux系统下如果服务器带宽跑满了,查看跟哪个ip通信占用带宽比较多,可以通过iftop命令进行查询,使用方法如下: 1 安装方法[软件官网地址:http://www.ex-parrot.com/~ ...

  6. 字符串逆序-c语言

    给定一个含有n个元素的字符串,实现逆序. 这是个很基础的问题,实现方式也是很常见的c语言思路.虽然简单,但是仍然记录下来. [期望] 比如char str[] = "abcdefg" ...

  7. ICEcoder显示汉字出现乱码的处理

    在网上看到icecoder这个小东西,是一个基于web的编辑器,很不错.唯一的缺点是打开的文件中汉字会变成乱码. 经查看源代码,在lib/file-control.php中,第89行是: echo ' ...

  8. 使用代码编辑器Sublime Text 3进行前端开发及相关快捷键

    推荐理由: Sublime Text:一款具有代码高亮.语法提示.自动完成且反应快速的编辑器软件,不仅具有华丽的界面,还支持插件扩展机制,用她来写代码,绝对是一种享受.相比于浮肿沉重的Eclipse, ...

  9. Python——集合与字典练习

    集合与字典练习question1问题描述:有一个列表,其中包括 10 个元素,例如这个列表是[1,2,3,4,5,6,7,8,9,0],要求将列表中的每个元素一次向前移动一个位置,第一个元素到列表的最 ...

  10. es6 fs 输出文件 iviewDemo

    // fs.open('./env.js', 'w', function(err, fd) { // // const buf = 'export default "development& ...