抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。

  产品族

  是指位于不同产品等级结构中,功能相关联的产品组成的家族。一般是位于不同的等级结构中的相同位置上。显然,每一个产品族中含有产品的数目,与产品等级结构的数目是相等的,形成一个二维的坐标系,水平坐标是产品等级结构,纵坐标是产品族。叫做相图。
  当有多个不同的等级结构的产品时,如果使用工厂方法模式就势必要使用多个独立的工厂等级结构来对付这些产品的等级结构。如果这些产品等级结构是平行的,会导致多个平行的工厂等级结构。
  抽象工厂模式使用同一个 工厂等级结构负责这些不同产品等级结构产品对象的创建。
  对于每一个产品族,都有一个具体工厂。而每一个具体工厂创建属于同一个产品族,但是分属于不同等级结构的产品。
  通过引进抽象工厂模式,可以处理具有相同(或者相似)等级结构的多个产品族中的产品对象的创建问题。
  由于每个具体工厂角色都需要负责两个不同等级结构的产品对象的创建,因此每个工厂角色都需要提供两个工厂方法,分别用于创建两个等级结构的产品。既然每个具体工厂角色都需要实现这两个工厂方法,所以具有一般性,不妨抽象出来,移动到抽象工厂角色中加以声明。
  就好比,水果分为
  北方水果:北方苹果,北方香蕉;
  南方水果:南方苹果,南方香蕉;
  热带水果:热带苹果,热带香蕉;
  这样看,北方水果,南方水果,热带水果这就是三个不同的产品族。
 
  下面写一个简单的抽象工厂模式的小例子:
  首先确定我们的产品族,产品族为南方水果与北方水果,而水果(产品等级)有苹果和香蕉产品等级,所以具体产品为南方苹果,北方苹果,南方香蕉,北方香蕉。
  具体代码如下:首先每一个族中都有苹果和香蕉,所以定义两个抽象类,其中包含一个抽象方法
苹果
 public abstract class Apple implements Fruit{
public abstract void get();
}

香蕉

 public abstract class Banana implements Fruit{
public abstract void get();
}

  在写苹果香蕉的具体产品,并各自继承对应的抽象类

北方苹果

 public class NorthApple extends Apple {
@Override
public void get() {
System.out.println("采集北方苹果");
} }

南方苹果

public class SouthApple extends Apple{
@Override
public void get() {
System.out.println("采集南方苹果");
}
}

北方香蕉

public class NorthBanana extends Banana {
@Override
public void get() {
System.out.println("采集北方香蕉");
}
}

南方香蕉

 public class SouthBanana extends Banana {
@Override
public void get() {
System.out.println("采集南方香蕉");
}
}

  接下来创建工厂,而每一个产品族都对应一个具体的工厂,每个产品族都包含苹果和香蕉,所以每个工厂中都包含苹果和香蕉

抽象工厂

 public interface FruitFactory {
//实例化一个苹果
public Fruit getApple();
//实例化一个香蕉
public Fruit getBanana();
}
北方工厂
 public class NorthFactory implements FruitFactory{
@Override
public Fruit getApple() {
return new NorthApple();
} @Override
public Fruit getBanana() {
return new NorthBanana();
}
}
南方工厂 
 public class SouthFactory implements FruitFactory{
@Override
public Fruit getApple() {
return new SouthApple();
} @Override
public Fruit getBanana() {
return new SouthBanana();
}
}

  最后,写一个运行的主方法

 public class MainClass {
public static void main(String[] args) {
FruitFactory nf = new NorthFactory(); Fruit nApple = nf.getApple();
nApple.get(); Fruit nBanana = nf.getBanana();
nBanana.get(); FruitFactory sf = new SouthFactory(); Fruit sApple = sf.getApple();
sApple.get(); Fruit sBanana = sf.getBanana();
sBanana.get();
}
}
  最终运行结果

      采集北方苹果
   采集北方香蕉
   采集南方苹果
   采集南方香蕉

 这时如果想新增一个产品族热带水果,只需新建一个热带产品族的工厂即可,已经建好的南方与北方工厂无需改动,也符合开放-封闭原则。

 但缺点也很明显,从产品等级来看,如果想新增一个产品等级,例如上面的例子只有苹果与香蕉,如果现在新增一个葡萄,就需要在抽象工厂中添加一个葡萄抽象方法,再在每一个具体工厂中实现此方法。这样就完全不符合开放-封闭原则了。

  优点:
    1.它分离了具体的类
    2.它使得易于交换产品系列
    3.它有利于产品的一致性
  缺点:
    难以支持新种类的产品
 

  抽象工厂模式中包含的角色及其职责

   1、抽象工厂(Creator)角色:(FruitFactory)
      是抽象工厂模式的核心,包含对多个产品结构的声明,任何工厂类都必须实现这个接口。
   2、具体工厂(Concrete Creator)角色:(AppleFactory、BananaFactory)
      这是实现抽象工厂接口的具体工厂类,负责实例化某个产品族中的产品对象。
   3、抽象产品(Product)角色:(Fruit)
      抽象工厂模式所创建的对象的父类,它负责描述所有实例所共有的公共接口。
   4、具体产品(Concrete Product)角色:(Apple、Banana)
      抽象模式所创建的具体实例对象。
 
   抽象工厂中方法对应产品结构,具体工厂对应产品族。
 

java设计模式-----3、抽象工厂模式的更多相关文章

  1. Java 设计模式之抽象工厂模式(三)

    原文地址:Java 设计模式之抽象工厂模式(三) 博客地址:http://www.extlight.com 一.前言 上篇文章 <Java 设计模式之工厂模式(二)>,介绍了简单工厂模式和 ...

  2. java设计模式之抽象工厂模式

    上一篇文章(http://www.cnblogs.com/liaoweipeng/p/5768197.html)讲了简单工厂模式,但是简单工厂模式存在一定的问题,如果想要拓展程序,必须对工厂类进行修改 ...

  3. Java设计模式系列-抽象工厂模式

    原创文章,转载请标注出处:https://www.cnblogs.com/V1haoge/p/10755412.html 一.概述 抽象工厂模式是对工厂方法模式的再升级,但是二者面对的场景稍显差别. ...

  4. java设计模式(三)--抽象工厂模式

    转载:http://zz563143188.iteye.com/blog/1847029 前面的工厂方法模式虽然清晰,但还是感觉有些繁琐,通常使用的还是抽象工厂模式. 工厂方法模式有一个问题就是,类的 ...

  5. Java 设计模式之抽象工厂模式

    抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在抽 ...

  6. [java] java 设计模式(2):抽象工厂模式(Abstract Factory)

    工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这 ...

  7. Java设计模式(3)——抽象工厂模式

    抽象工厂模式是所有形态的工厂模式中最为抽象和最其一般性的.抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象. 一.产品族和产品等级结构 为 ...

  8. java设计模式之抽象工厂模式学习

    工厂模式有个问题就是,类的创建依赖工厂.要想增加一个工厂类,就要修改原来的代码,这违背了闭包原则.所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的 ...

  9. Java设计模式之【工厂模式】(简单工厂模式,工厂方法模式,抽象工厂模式)

    Java设计模式之[工厂模式](简单工厂模式,工厂方法模式,抽象工厂模式) 工厂模式出现的原因 在java中,创建一个对象最简单的方法就是使用new关键字.但在一些复杂的业务逻辑中,创建一个对象不只需 ...

  10. 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)

    原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factor ...

随机推荐

  1. CentOS7基础建站指南(笔记)

    由于前段时间腾讯云打折,所以买了一台小服务器,想着以后写几个小网站,博客什么的,但是一开始就遇到了难题,大概就是Linux服务器的配置问题,比如如何假设服务器,配置非root用户,配置服务器数据的非r ...

  2. 常用的PHP超全局变量$_SERVER 收集整理

    传送带:https://www.cnblogs.com/rendd/p/6182918.html

  3. spark 广播变量

    Spark广播变量 使用广播变量来优化,广播变量的原理是: 在每一个Executor中保存一份全局变量,task在执行的时候需要使用和这一份变量就可以,极大的减少了Executor的内存开销. Exe ...

  4. bzoj4998: 星球联盟(link-cut-tree)

    题面 bzoj 题解 bzoj2959: 长跑的弱化版 产生了环就并查集维护一下 Code #include<bits/stdc++.h> #define LL long long #de ...

  5. CF1007D. Ants(树链剖分+线段树+2-SAT及前缀优化建图)

    题目链接 https://codeforces.com/problemset/problem/1007/D 题解 其实这道题本身还是挺简单的,这里只是记录一下 2-SAT 的前缀优化建图的相关内容. ...

  6. 认识CSS3新增选择器和样式

    前端之HTML5,CSS3(二) CSS3新增选择器和样式 CSS3新增选择器 结构伪类选择器 :first-child:选取父元素中的第一个子元素的指定选择器 :last-child:选取父元素中的 ...

  7. 不依赖JQuery的入门Ajax代码

    今天看了head first ajax这本书里ajax的实例,讲的很好,这本书觉着很不错,推荐下. Ajax (Asynchronous Javascript and XML)即异步Javascrip ...

  8. CKEditor图片上传实现详细步骤(使用Struts 2)

    本人使用的CKEditor版本是3.6.3.CKEditor配置和部署我就不多说. CKEditor的编辑器工具栏中有一项“图片域”,该工具可以贴上图片地址来在文本编辑器中加入图片,但是没有图片上传. ...

  9. 【ORACLE】ID 2299494.1 安装Oracle 11g 86%报错:Error in invoking target 'agent nmhs' of makefile

    参考: ID 2299494.1 In this Document   Symptoms   Changes   Cause   Solution   References APPLIES TO: O ...

  10. 大数据搭建各个子项目时配置文件技巧(适合CentOS和Ubuntu系统)(博主推荐)

    不多说,直接上干货! 很多同行,也许都知道,对于我们大数据搭建而言,目前主流,分为Apache 和 Cloudera 和 Ambari. 后两者我不多说,是公司必备和大多数高校科研环境所必须的! 分别 ...