爪哇语言抽象工厂创立性模式介绍

k-Wave仿真例程:创建超声换能器并绘制声场分布 k-Wave软件是为了模拟超声波在1D、2D或3D中的传播。应用示例包括:- 均匀和非均匀介质中的传播- 模拟各种类型的传感器- 模拟多普勒效应- 衍射、折射和反射- 光声、超声成像- 波束合成、成像重建- 模拟弹波。 阅读详情
工厂模式有简单工厂模式,工厂方法模式和抽象工厂模式几种形态。其中简单工厂模式和工厂方法模式已经在前面作过介绍。在这里,我们来介绍抽象工厂模式。

  抽象工厂模式是所有形态的工厂模式中最为抽象和最具广泛性的一种形态。

  抽象工厂模式的定义

  抽象工厂模式是工厂方法模式的进一步扩广化和抽象化。我们给出抽象工厂模式的类图定义如下。


       图1. 抽象工厂模式的类图定义

  从上图可以看出,简单工厂模式涉及到以下的角色

   抽象工厂(AbstractFactory)类或接口

   担任这个角色的是工厂方法模式的核心,它是与应用程序无关的。任何在模式中创立对象的工厂类必须实现这个接口,或继承这个类。

   实工厂类 (Conrete Factory)

   担任这个角色的是与应用程序紧密相关的,直接在应用程序调用下,创立产品实例的那样一些类。

   抽象产品 (Abstract Product)

   担任这个角色的类是工厂方法模式所创立的对象的父类,或它们共同拥有的接口。

   实产品 (Concrete Product)

   担任这个角色的类是工厂方法模式所创立的任何对象所属的类。

  怎么这个类图和工厂方法模式的类图看起来是一样的?

  是的,图是一样的,但是含义有很大的不同。必须指出,在抽象工厂模式中,抽象产品 (AbstractProduct) 可能是一个或多个,从而构成一个或多个产品族(Product Family)。 在只有一个产品族的情况下,抽象工厂模式实际上退化到工厂方法模式。在上面的类图中,只给出了一个产品族,相当于位图中的一个点,而完整的位图应当是三维的,如下图。



     图2. 抽象工厂模式的位图

 
  从位图可以清楚地看到,与纸面垂直的数轴,即第三维轴,是代表产品族的数轴。上面的位图中展示的是有两个产品族,族A和族B的情形。

  在只有一个产品族时,第三维就坍缩掉,位图也就只剩下两维。这时抽象工厂模式就退化得与工厂方法模式一模一样。

在什么情形下应当使用抽象工厂模式

  在以下情况下,应当考虑使用抽象工厂模式。

  首先,一个系统应当不依赖于产品类实例被创立,组成,和表示的细节。这对于所有形态的工厂模式都是重要的。

  其次,这个系统的产品有多于一个的产品族。

  第三,同属于同一个产品族的产品是设计成在一起使用的。这一约束必须得在系统的设计中体现出来。

  最后,不同的产品以一系列的接口的面貌出现,从而使系统不依赖于接口实现的细节。

  其中第二丶第三个条件是我们选用抽象工厂模式而非其它形态的工厂模式的关键性条件。

  抽象工厂模式在小花果园系统中的实现

  现在,我们在佛罗里达的渡假小屋修整好啦。接下来,一项重要而光荣的工作,就是开发小屋后面的小花园。这意味着,我们有两处小花园需要照料,一处在北方地区,另一处在亚热带地区。抽象工厂模式正好适用于我们的情况。


图3. 抽象工厂模式应用于小花果园系统中。三种不同的背景颜色可以区分工厂类,蔬菜类(第一产品族),和水果类的类图(第二产品族)

两处花园就相当于两个产品族。显然,给北方花园的植物是要种植在一起的,给南方花园的植物是要另种植在一起的。这种分别应当体现在系统的设计上面。这就满足了应当使用抽象工厂模式的第二和第三个条件。

package com.javapatterns.abstractfactory;

public interface Gardener {}

  代码清单1. 接口 Gardener。


package com.javapatterns.abstractfactory;

public class NorthenGardener implements Gardener
{
 public VeggieIF createVeggie(String name) { return new NorthernVeggie(name); }

 public FruitIF createFruit(String name) { return new NorthernFruit(name); }

}

  代码清单2. 实工厂类 NorthenGardener。


package com.javapatterns.abstractfactory;

public class TropicalGardener implements Gardener
{
 public VeggieIF createVeggie(String name) { return new TropicalVeggie(name); }

 public FruitIF createFruit(String name) { return new TopicalFruit(name); }

}

  代码清单3. 实工厂类 TropicalGardener。


package com.javapatterns.abstractfactory;

public interface VeggieIF {}

  代码清单4. 接口 VeggieIF。


package com.javapatterns.abstractfactory;

public class NorthernVeggie implements VeggieIF
{
 public NorthernVeggie(String name) { this.name = name; }

 public String getName(){ return name; }

 public void setName(String name){ this.name = name; }

 private String name;
}


代码清单5. 实产品类 NorthernVeggie。实产品类 NorthernFruit 与此极为类似,故略去。


package com.javapatterns.abstractfactory;

public class TropicalVeggie implements VeggieIF
{
 public TropicalVeggie(String name) { this.name = name;}

 public String getName(){ return name; }

 public void setName(String name){ this.name = name; }

 private String name;
}

  代码清单6. 实产品类 TropicalVeggie。实产品类 TropicalFruit 与此极为类似,故略去。

  笔者对植物的了解有限,为免遗笑大方,在上面的系统里采用了简化处理。没有给出高纬度和低纬度的水果类或蔬菜类的具体名称。

抽象工厂模式的另一个例子

  这个例子讲的是微型计算机的生产。产品族有两个,PC(IBM系列)和Mac(MacIntosh系列)。显然,我们应该使用抽象工厂模式,而不是工厂方法模式,因为后者适合于处理只有一个产品族的情形。


图4. 抽象工厂模式应用于微型计算机生产系统中。两种不同的背景颜色可以区分两类产品族,及其对应的实工厂类

   关于模式的实现

  在抽象实现工厂模式时,有下面一些值得注意的技巧。

  第一丶实工厂类可以设计成单态类。很显然,在小花果园系统中,我们只需要 NorthenGardener 和TropicalGardener 的一个实例就可以了。关于单态类的知识,请见<爪哇语言单态类创立性模式>。

  第二丶在实现抽象工厂模式时,产品类往往分属多于一个的产品族,而针对每一族,都需要一个实工厂类。在很多情况下,几个实工厂类都彼此相象,只有些微的差别。

  这时,笔者建议使用原始模型(Prototype)模式。这一模式会在以后介绍,届时作者会进一步阐述这一点。

  第三丶设计更加灵活的实工厂。以微型计算机生产系统为例,PCProducer 是一个实工厂类,它的不灵活之处在于,每一种产品都有一个工厂方法。CPU 有createCPU(),RAM 有createRAM(),等等。如果一个已有的系统需要扩充,比如增加硬盘这一新产品,我们就需要增加一系列的接口 (createHD())丶类(HD, PCHD, MacHD)和方法。这似乎不很理想。

  一个解决的办法是,把createCPU(),createRAM(), createHD()这几个方法合并为一个createPart(String type)方法。这个合并后的方法返还一个Part接口。所有的产品都要实现这一接口,而CPU,RAM,和HD接口则不再需要了。每一个实产品都需要有一个属性,表明它们的种类是CPU,RAM,和HD。

  这样做的结果是,数据类型的丰富结构被扁平化了。客户端拿到的永远是一个Part接口。这对客户端而言不很安全。

  第四丶抽象工厂类可以配备静态方法,以返还实工厂。设计的方法有两种。

  一种是以一个静态方法,按照参量的值,返回所对应的实工厂。静态方法的数据类型是抽象方法类。

  另一种是以每一个实工厂类都配备一个静态方法,其数据类型是该实工厂类。

  问答题

  第1题。如上面的讨论,抽象工厂类可以配备一个静态方法,按照参量的值,返回所对应的实工厂。请把微型计算机生产系统的抽象工厂类按照这一方案改造,给出UML类图和源代码。

  第2题。如上面的讨论,抽象工厂类可以配备一系列静态方法对应一系列的实工厂。请把微型计算机生产系统的抽象工厂类按照这一方案改造,给出UML类图和源代码。

  第3题。如上面的讨论,实工厂类可以设计成单态类。请在第1题的基础上把微型计算机生产系统的实工厂类按照这一方案改造,给出UML类图和源代码。

问答题答案

  第1题。微型计算机生产系统的抽象工厂原本是接口,现在需要改造成抽象类。


图5. 三种不同的背景颜色可以区分抽象工厂类,两类产品族,及其对应的实工厂类。ComputerProducer 类图中类名为斜体表明该类是抽象的,而getProducer()的下划线表明该方法是静态的

package com.javapatterns.abstractfactory.exercise1;

public class ComputerProducer
{
 public static ComputerProducer getProducer(String which)
 {
  if (which.equalsIgnoreCase("PC"))
  {
   return new PCProducer();
  }
  else (which.equalsIgnoreCase("Mac"))
  {
   return new MacProducer();
  }
 }
}

  代码清单7. 抽象类 ComputerProducer 的方法 getProducer(String which)。

  第2题。略。

  第3题。本题答案是在第1题基础之上的。


图6. 三种不同的背景颜色可以区分抽象工厂类,两类产品族,及其对应的实工厂类。ComputerProducer 类图中类名为斜体表明该类是抽象的,而getProducer()的下划线表明该方法是静态的。MacProducer 和 PCProducer 的构造子是私有的,因此这两个类必须自己将自己实例化。

package com.javapatterns.abstractfactory.exercise3;

abstract public class ComputerProducer
{
 public static ComputerProducer getProducer(String which)
 {
  if (which.equalsIgnoreCase("PC"))
  {
   return PCProducer.getInstance();
  }
  else (which.equalsIgnoreCase("Mac"))
  {
   return MacProducer.getInstance();
  }
 }
}

代码清单8.抽象工厂类ComputerProducer。


package com.javapatterns.abstractfactory.exercise3;

public class MacProducer extends ComputerProducer
{
 private MacProducer() {
}

public CPU createCPU() {}

public RAM createRAM() {}

private static final m_MacProducer = new MacProducer();

}

代码清单9. 实工厂类 MacProducer 是单态类。读过笔者<单态创立性模式>一节的读者应当知道,这里使用的单态类实现方法是饿汉式方法。

package com.javapatterns.abstractfactory.exercise3;

public class PCProducer extends ComputerProducer
{
 private PCProducer() {
}

public CPU createCPU() {}

public RAM createRAM() {}

private static final m_PCProducer = new PCProducer();
}

  代码清单10. 实工厂类 PCProducer 是单态类,使用的单态类实现方法是饿汉式方法。

  各产品类没有变化,因此不在此重复
手把手教你用Keil5和Proteus8给51单片机跑个流水灯(附完整源码+安装包) 本文详细介绍了如何使用Keil5和Proteus8为51单片机实现流水灯效果,包括开发环境配置、汇编代码编写、电路设计及仿真调试。通过完整的源码和安装包,帮助初学者快速掌握C51单片机开发的核心流程,适合嵌入式开发入门学习。 阅读详情

相关推荐

设计模式抽象工厂模式的一个例子

设计模式抽象工厂模式的一个例子,希望对大家有用~~~~~~

Java设计模式圣经连载(03)-抽象工厂模式

1.3 抽象工厂(Abstract Factory)模式    抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品具体类型的情况下,创建多个产品族中的产品对象。这就是抽象工厂模式的用意。    每个模式都是针对一定问题的解决方案。抽象工厂模式面对的问题是多产品等级结构的系统设计。    在学习抽象工厂具体实例之前,应该明白两个重要的概念:产品族和产品等级。    产品族:是指位于不同产...

weixin_33849942的博客 217

mlnx-ofed驱动包(AMD64)

mlnx_ofed驱动包(AMD64)

设计模式-抽象工厂模式

工厂模式提供创建对象的接口,是最常用的设计模式。本实例根据工厂模式的分类不同,介绍工厂模式之三的抽象工厂模式的使用方法及使用规则。 实现抽象工厂模式的技术要点如下: 1.抽象工厂模式和工厂方法模式的区别在于需要创建对象的复杂度上。而且抽象工厂模式是这三种模式中最为抽象、最具一般的。 2.使用抽象工厂模式需要满足以下条件:系统中有多个产品族,二系统一次只可能消费其中一族产品;同属于同一个产品

上官云霆的博客 468

抽象工厂模式

抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。根据里氏替换原则,任何接受父类型的地方,都应当能够接受子类型。因此,实际上系统所需要的,仅仅是类型与这些抽象产品角色相同的一些实例,而不是这些抽象产品的实例。换言之,也就是这

perfect-顾(coder)的博客 362

工厂模式 java场景_抽象工厂模式应用场景_抽象工厂模式_工厂模式 java

抽象工厂模式的界面类型。当开发人员在程序中确定界面类型后,就可以通过界面类型获得界面上组件的实例。例如在下面的这段代码中,程序获得操作系统的类型,并根据操作系统设定程序的界面类型:例子让我们通过一个简单的例子来看一看抽象工厂模式是如何在应用层被使用的。假设你才买了一套住宅,屋顶有一个花园,而你需要设计一下花园的布局。花园右侧有一个花台,边上需要种一排植物,中心需要种主体植物。根据风格的不同,花园可...

weixin_33147645的博客 347

3. 抽象工厂

文章目录3. 抽象工厂模式(使用频率:★★★★★)1. 概念2. 抽象工厂模式结构抽象工厂模式包含以下4个角色:3. 抽象工厂代码实现4. 例子5. 拓展产品6. 优缺点7. 模式适用环境 3. 抽象工厂模式(使用频率:★★★★★) 工厂方法模式 每个具体工厂只有一个或者一组重载的工厂方法,只能生产一种产品,可能会导致系统中存在大量的工厂类,势必会增加系统的开销 抽象工厂模式 一个工厂可以生产一系列产品(一族产品),极大减少了工厂类的数量 1. 概念 产品等级结构:产品等级结构即产品的继承结构

weixin_53475254的博客 973

爪哇语言简单工厂创立模式介绍

研究和使用创立模式的必要  面向对象的设计的目的之一,就是把责任进行划分,以分派给不同的对象。我们推荐这种划分责任的作法, 是因为它和封装(Encapsulation)和分派(Delegation)的精神是相符合的。创立模式把对象的创立过程封装起来,使得创立实例的责任与使用实例的责任分割开, 并由专门的模块分管实例的创立,而系统在宏观上不再依赖于对象创立过程的细节。   所有面向对象的语言

lizl的专栏 1013

爪哇语言工厂方法创立模式介绍

正如同笔者在一节里介绍的,工厂模式有简单工厂模式,工厂方法模式抽象工厂模式几种形态。简单工厂模式已经在前面作过介绍。在简单工厂模式中,一个工厂类处于对产品类实例化调用的中心位置上,它决定那一个产品类应当被实例化, 如同一个交通警察站在来往的车辆流中,决定放行那一个方向的车辆向那一个方向流动一样。   而本节要讨论的工厂方法模式是简单工厂模式的进一步抽象化和推广。它比简单工厂模式聪明的地方在于,

lizl的专栏 1622

简单工厂创立模式介绍

爪哇语言简单工厂创立模式介绍研究和使用创立模式的必要   面向对象的设计的目的之一,就是把责任进行划分,以分派给不同的对象。我们推荐这种划分责任的作法, 是因为它和封装(Encapsulation)和分派(Delegation)的精神是相符合的。创立模式把对象的创立过程封装起来,使得创立实例的责任与使用实例的责任分割开, 并由专门的模块分管实例的创立,而系统在宏观上不再依赖于对象创立过程的

xhw79的专栏 1334

抽象工厂模式代码

爪哇语言抽象工厂创立模式介绍   工厂模式有简单工厂模式,工厂方法模式抽象工厂模式几种形态。其中简单工厂模式和工厂方法模式已经在前面作过介绍。在这里,我们来介绍抽象工厂模式。   抽象工厂模式是所有形态的工厂模式中最为抽象和最具广泛的一种形态。   抽象工厂模式的定义  抽象工厂模式是工厂方法模式的进一步扩广化和抽象化。我们给出抽象工厂模式的类图定义如下。    ...

java技术之家 350

Java设计模式专辑

 [前言:]面向对象开发中程序员更重视代码的重用和可维护,设计模式使人们可以更加简单方便地重复使用成功的设计和体系结构。目前已有的模式有100多个,在这里我收集收集和整理了在栏目中发表的关于设计模式的文章,在此我要感谢阎宏博士栏目中主要的文章均出自他的笔下。   爪哇语言结构模式之变压器模式介绍  结构模式描述类和对象怎样结合在一起成为较大的结构。 结构模式描述两种不同的东西:类与类的...

轻轻草原 118

JAVA设计模式

[前言:]面向对象开发中程序员更重视代码的重用和可维护,设计模式使人们可以更加简单方便地重复使用成功的设计和体系结构。目前已有的模式有100多个,在这里我收集收集和整理了在栏目中发表的关于设计模式的文章,在此我要感谢阎宏博士栏目中主要的文章均出自他的笔下。  爪哇语言结构模式之变压器模式介绍  结构模式描述类和对象怎样结合在一起成为较大的结构。 结构模式描述两种不同的东西:类与类的实例。

smily的专栏 835

设计模式花园(三)-工厂模式

创建一个接口和一系列实现该接口的实体类,然后创建一个工厂类,由传入类型判断实例化哪一个实体类。例如:1)日志记录器。选择哪种存储方式:硬盘、远程服务器等。2)数据库访问,选择哪类数据库进行链接。3)设计一个连接服务器的框架,选择哪种协议进行连接。Design Garden女主人需要一只猫和一只狗,提高花园温馨度,于是我们设计一个宠物工厂,根据女主人需要创造各类宠物。

weixin_45562030的博客 352

spring学习中常用到的工厂,抽象工厂学习

 工厂模式有简单工厂模式,工厂方法模式抽象工厂模式几种形态。其中简单工厂模式和工厂方法模式已经在前面作过介绍。在这里,我们来介绍抽象工厂模式。   抽象工厂模式是所有形态的工厂模式中最为抽象和最具广泛的一种形态。   抽象工厂模式的定义  抽象工厂模式是工厂方法模式的进一步扩广化和抽象化。我们给出抽象工厂模式的类图定义如下。        图1. 抽象工厂模式的类图定义

maqianmaqian的专栏 1683

java 抽象工厂 类图_spring学习中常用到的工厂,抽象工厂学习 | 学步园

工厂模式有简单工厂模式,工厂方法模式抽象工厂模式几种形态。其中简单工厂模式和工厂方法模式已经在前面作过介绍。在这里,我们来介绍抽象工厂模式抽象工厂模式是所有形态的工厂模式中最为抽象和最具广泛的一种形态。抽象工厂模式的定义抽象工厂模式是工厂方法模式的进一步扩广化和抽象化。我们给出抽象工厂模式的类图定义如下。图1. 抽象工厂模式的类图定义从上图可以看出,简单工厂模式涉及到以下的角色抽象工厂(Ab...

weixin_36247139的博客 878

简单工厂模式UML类图与源码实现(转)

简单工厂模式UML图源码:Operation类 Java代码 package Operation;     public abstract class Operation {       double numberA=0;       double numberB=0;              public double getNumberA() {           return numberA;       }         public void setNumberA(double numbe

yishuangpangxie的专栏 1万+

设计模式抽象工厂模式,结合类图秒懂!

通过前篇文章《设计模式:工厂模式》的介绍,我们对工厂模式有了深入的了解,今天继续介绍一种特殊的工厂模式,也就是抽象工厂模式。 定义 抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式,是工厂方法模式的升级版,在有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。 抽象工厂模式包含了几个...

1万+
上一篇: 爪哇语言结构性模式之变压器模式介绍
下一篇: 爪哇语言工厂方法创立性模式介绍
lizl
博客等级 码龄25年 6粉丝 42原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值