工厂模式:

工厂模式可以分为三类:

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设计模式(一) 简单工厂模式不简单

    摘要:本文介绍了简单工厂模式的概念,优缺点,实现方式,以及结合Annotation和反射的改良方案(让简单工厂模式不简单).同时介绍了简单工厂模式(未)遵循的OOP原则.最后给出了简单工厂模式在JDB ...

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

    工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类.工厂模式的形态工厂模式主要用一下几种形态:1:简单工厂(Simple Factory).2:工厂方法(Factory M ...

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

    工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类.工厂模式的形态工厂模式主要用一下几种形态:1:简单工厂(Simple Factory).2:工厂方法(Factory M ...

  4. 设计模式(Python)-简单工厂,工厂方法和抽象工厂模式

    本系列文章是希望将软件项目中最常见的设计模式用通俗易懂的语言来讲解清楚,并通过Python来实现,每个设计模式都是围绕如下三个问题: 为什么?即为什么要使用这个设计模式,在使用这个模式之前存在什么样的 ...

  5. Java设计模式之简单工厂、工厂方法和抽象工厂

    在前面的学习中(参见前面的博客),我们学到了很多OO原则: 封装变化 多用组合,少用继承 针对接口/超类编程,不针对实现编程 松耦合 开闭原则 让我们从一个简单的类开始,看看如何将之改造成符合OO原则 ...

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

    很多时候,我发现这三种设计模式难以区分,常常会张冠李戴闹了笑话.很有必要深入总结一下三种设计模式的特点.相同之处和不同之处. 1 本质 三个设计模式名字中都含有“工厂”二字,其含义是使用工厂(一个或一 ...

  7. 简单工厂 VS 工厂方法 VS 抽象工厂

    说到设计模式.自然少不了简单工厂模式.工厂方法和抽象工厂这三姐妹. 它们之间可谓是各有所长,术业专攻啊!这篇博客来简单的梳理一下三者之间的关系. 那么工厂又是什么意思呢?结合三者的特点,我觉得能够这样 ...

  8. Java设计模式学习笔记(二) 简单工厂模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 正文开始... 1. 简介 简单工厂模式不属于GoF23中设计模式之一,但在软件开发中应用也较为 ...

  9. Java设计模式:Simple Factory(简单工厂)模式

    概念定义 简单工厂(Simple Factory)模式,又称静态工厂方法(Static Factory Method)模式,即定义一个工厂类,根据传入的不同参数创建不同的产品实例,这些实例对象具有共同 ...

  10. head first 设计模式笔记4-工厂模式(简单工厂、工厂方法、抽象工厂)

    1.简单工厂模式 Pizza public abstract class Pizza { abstract void prepare(); abstract void bake(); abstract ...

随机推荐

  1. Http远程调用服务

    GET public static string GetJsonStr(string webApi)        {            string serviceAddress = webAp ...

  2. 1624: [Usaco2008 Open] Clear And Present Danger 寻宝之路

    1624: [Usaco2008 Open] Clear And Present Danger 寻宝之路 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 3 ...

  3. JavaScript 基础阶段测试题

    JavaScript 基础阶段测试题,试试你能得多少分? 一.选择题1.分析下段代码输出结果是( )    var arr = [2,3,4,5,6];    var sum =0;    for(v ...

  4. windows系统下安装composer

    使用安装程序安装 这是将 Composer 安装在你机器上的最简单的方法. 下载并且运行 Composer-Setup.exe,它将安装最新版本的 Composer 安装完成后,将composer的b ...

  5. iOS开发之Quartz2D

    1.         Quartz2D概述及作用 Quartz2D的API是纯C语言的,Quartz2D的API来自于Core Graphics框架. 数据类型和函数基本都以CG作为前缀,比如: CG ...

  6. iOS开发之UITabBarController

    1.概述 跟UINavigationController类似,UITabBarController也可以轻松地管理多个控制器,轻松完成控制器之间的切换,典型例子就是QQ.微信等应用. 2.UITabB ...

  7. 学点Groovy来理解build.gradle代码

    在写这篇博客时,搜索参考了很多资料,网上对于 Groovy 介绍的博客已经特别多了,所以也就没准备再详细的去介绍 Groovy,本来也就计划写一些自己认为较重要的点.后来发现了 Groovy 的官方文 ...

  8. java实现8种排序算法(详细)

    八种排序分别是:直接插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 希尔排序在时间性能上优于直接插入排序,但希尔排序是一种不稳定排序. 快速排序的时间性能也优于冒泡 ...

  9. Excel 按模板格式导出

    最近遇到一个问题,就是导出数据的时候需要自定义的表头,如图 如果自己用代码写表头的话,可能会有点复杂,而且代码量很多,所以我就想了一个办法,直接在Excel里面把表头定义好,然后把数据写入Excel模 ...

  10. as3中去掉字符串两边的空格,换行符

     as3 去掉字符串两边的空格,换行符,方法一  ActionScript Code  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20   pub ...