工厂模式:

工厂模式可以分为三类:

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. Pascal's Triangle II leetcode

    Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3,Return [1,3, ...

  2. gps数据转百度地图坐标

    昨天大叔问我一个关于gps的问题,一开始我是懵逼的,因为之前我从来没有接触过这玩意儿.稍微查了一下,gps协议包含了$开头和<>结尾,但这并不是重点.大叔告诉我说他们采集了一些位置的经纬度 ...

  3. ubuntu 虚拟机vm virtualbox 不能打开 win7

    ubuntu某方面总有些不便,下载个虚拟机装个win7 但是第二次打开的时候就出现了安装是的场景: 原因很简单: 是因为安装了之后没有把win7的镜像文件移除,每次打开时会检测cd/dvd文件/(is ...

  4. 3.java的hello word.继承.泛型.反射.配置项.数据库操作.lombok

    迷迷茫茫的开始了第一步.弄个hello word.结果这第一小步也不是那么的顺利. 明明照着图敲的.可就是没有运行选项. 为此还百度了一下.也没有什么答案.最后只能老老实实的看了.结果还是粗心的问题. ...

  5. Java中实现短信发送

    最近跟着做公司的项目偶然接触到的,顺势把这个给记录下来,给自己梳理一下. 采用引入第三方工具的方式,网上查了半天,发现简单的实现方式便是注册一个中国网建的账号,新建账号的时候会附带赠几条免费短信,彩信 ...

  6. FDG内存分配器笔记

    FDG: 大规模并行系统中的动态内存分配器由于需要全局同步(记账) ,导致性能急剧下降. 代码解析 1.superblock 类中包含两个变量,两个函数.默认superblock大小为2048 ite ...

  7. C++移位运算符详解

    移位运算符包括左移"<<"和右移">>" 左移运算符<<: 1.无符号 语法格式:需要移位的数字<<移位的次数n ...

  8. 【子非鱼】归并排序过程呈现之java内置GUI表示

    在网上看到一个视频将各种排序用视频表示出来,配上音乐,挺好玩的样子,就算是不会编程的人看到也会觉得很舒服,碰巧我也正在写归并算法,于是就用java的GUI实现一个. 归并排序的时间复杂度是T(n)=O ...

  9. java学习笔记 --- 数组

    一.Java的内存分配   A:栈内存: 存储局部变量,只要是在方法中定义的变量都是局部变量.一旦变量的生命周期结束该变量就被释放.   B:堆内存: 存储所有new出来的,及实体(对象),每一个实体 ...

  10. ioS开发之CoreLocation(GPS定位)

    1.概述 在iOS开发中,要想加入地图和定位功能这2大功能,必须基于2个框架进行开发 (1)Map Kit :用于地图展示 (2)Core Location :用于地理定位 2个热门专业术语: LBS ...