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

思科模拟器汉化教程(附带中文汉化包) 思科模拟器是一种模拟Cisco网络设备的软件工具。它可以模拟Cisco网络设备的所有功能,包括路由器、交换机、防火墙等,并提供了一个可视化的用户界面,让用户可以通过图形化的方式来管理网络设备。思科模拟器因其便捷、易用的特点被广泛应用于网络工程师的实验、测试和培训等方面思科模拟器的功能是强大的,但当我们在使用思科模拟器的时候就会有一些烦恼,由于思科是全球最大的企业级网络设备供应商之一。思科公司的产品和服务被广泛应用于各种领域和行业,所以思科模拟器默认是全英文的,但是在最新版本中是支持中文的。 阅读详情
研究和使用创立性模式的必要性

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

  所有面向对象的语言都有固定的创立对象的办法。爪哇语的办法就是使用new操作符。比如

StringBuffer s = new StringBuffer(1000);


  就创立了一个对象s,其类型是StringBuffer。使用new操作符的短处是事先必须明确知道要实例化的类是什么, 而且实例化的责任往往与使用实例的责任不加区分。使用创立性模式将类实例化,首先不必事先知道每次是要实例化哪一个类, 其次把实例化的责任与使用实例的责任分割开来,可以弥补直接使用new操作符的短处。

  而工厂模式就是专门负责将大量有共同接口的类实例化,而且不必事先知道每次是要实例化哪一个类的模式。

  工厂模式有几种形态

  工厂模式有以下几种形态:

   简单工厂(Simple Factory)模式

   工厂方法(Factory Method)模式,又称多形性工厂(Polymorphic Factory)模式

   抽象工厂(Abstract Factory)模式,又称工具箱(Kit或Toolkit)模式.

介绍简单工厂模式

  比如说,你有一个描述你的后花园的系统,在你的后花园里有各种的花,但还没有水果。你现在要往你的系统里引进一些新的类,用来描述下列的水果:

  葡萄 Grapes

  草莓 Strawberry

  萍果 Apple

  花和水果最大的不同,就是水果最终是可以采摘食用的。那么,很自然的作法就是建立一个各种水果都适用的接口,这样一来这些水果类作为相似的数据类型就可以和你的系统的其余部分,如各种的花有所不同,易于区分。


   图1. Grape, Strawberry和Apple是拥有共同接口FruitIF的类

package com.javapatterns.simplefactory;

public interface FruitIF {
 void grow();

 void harvest();

 void plant();

 String color = null;
 String name = null;
}

     代码清单1. 接口FruitIF的源代码。这个接口确定了水果类必备的方法:种植plant(),生长grow(), 以及收获harvest()。

package com.javapatterns.simplefactory;

public class Apple implements FruitIF
{

 public void grow()
 {
  log("Apple is growing...");
 }

 public void harvest()
 {
  log("Apple has been harvested.");
 }

 public void plant()
 {
  log("Apple has been planted.");
 }

 public static void log(String msg)
 {
  System.out.println(msg);
 }

 public int getTreeAge(){ return treeAge; }

 public void setTreeAge(int treeAge){ this.treeAge = treeAge; }

 private int treeAge;
}

     代码清单2. 类Apple的源代码。萍果是多年生木本植物,因此具备树龄treeAge性质

package com.javapatterns.simplefactory;

public class Grape implements FruitIF
{
 public void grow()
 {
  log("Grape is growing...");
 }

 public void harvest()
 {
  log("Grape has been harvested.");
 }

 public void plant()
 {
  log("Grape has been planted.");
 }

 public static void log(String msg)
 {
  System.out.println(msg);
  }

 public boolean getSeedful()
 {
  return seedful;
 }

 public void setSeedful(boolean seedful)
 {
  this.seedful = seedful;
 }

 private boolean seedful;
}

     代码清单3. 类Grape的源代码。葡萄分为有籽与无籽两种,因此具有seedful性质。

package com.javapatterns.simplefactory;

 public class Strawberry implements FruitIF
 {
  public void grow()
  {
   log("Strawberry is growing...");
  }

  public void harvest()
  {
   log("Strawberry has been harvested.");
  }

  public void plant()
  {
   log("Strawberry has been planted.");
  }

  public static void log(String msg)
  {
   System.out.println(msg);
  }
}

             代码清单4. 类Strawberry的源代码。

你作为小花果园的主人兼园丁,也是系统的一部分,自然要由一个合适的类来代表,这个类就是 FruitGardener类。这个类的结构请见下面的UML类图。


图2. FruitGardener类图。

  FruitGardener类会根据要求,创立出不同的水果类,比如萍果Apple,葡萄Grape或草莓Strawberry的实例。而如果接到不合法的要求,FruitGardener类会给出例外BadFruitException。


图3. BadFruitException类图。

package com.javapatterns.simplefactory;

public class FruitGardener
{
 public FruitIF factory(String which) throws BadFruitException
 {
  if (which.equalsIgnoreCase("apple"))
  {
   return new Apple();
  }
  else if (which.equalsIgnoreCase("strawberry"))
  {
   return new Strawberry();
  }
  else if (which.equalsIgnoreCase("grape"))
  {
   return new Grape();
  }
  else
  {
   throw new BadFruitException("Bad fruit request");
 }
 }
}

      代码清单5. FruitGardener类的源代码。

package com.javapatterns.simplefactory;

public class BadFruitException extends Exception
{
 public BadFruitException(String msg)
 {
  super(msg);
 }
}

      代码清单6. BadFruitException类的源代码。

  在使用时,只须呼叫FruitGardener的factory()方法即可

try
{
 FruitGardener gardener = new FruitGardener();

 gardener.factory("grape");
 gardener.factory("apple");
 gardener.factory("strawberry");
 ...
 }
 catch(BadFruitException e)
 {
  ...
}

  就这样你的小果园一定会有百果丰收啦!

简单工厂模式的定义

  总而言之,简单工厂模式就是由一个工厂类根据参数来决定创立出那一种产品类的实例。下面的UML类图就精确定义了简单工厂模式的结构。


      图4. 简单工厂模式定义的类图。

public class Creator
{
 public Product factory()
 {
  return new ConcreteProduct();
 }

}

public interface Product
{
}

public class ConcreteProduct implements Product
{
 public ConcreteProduct(){}

}

  代码清单7. 简单工厂模式框架的源代码。

  简单工厂模式实际上就是我们要在后面介绍的,工厂方法模式的一个简化了的情形。在读者熟悉了本节所介绍的简单工厂模式后,就不难掌握工厂方法模式了。

问答题

  在本节开始时不是说,工厂模式就是在不使用new操作符的情况下,将......类实例化的吗, 可为什么在具体实现时,仍然使用了new操作符呢?

  在本节的小果园系统里有三种水果类,可为什么在图3.(简单工厂模式定义的类图) 中产品(Product)类只有一种呢?

  请使用简单工厂模式设计一个创立不同几何形状,如圆形,方形和三角形实例的描图员(Art Tracer)系统。每个几何图形都要有画出draw()和擦去erase()两个方法。当描图员接到指令,要求创立不支持的几何图形时,要提出BadShapeException例外。

  请简单举例说明描图员系统怎样使用。

  在简单工厂模式的定义(见图4)中和花果园例子中,factory()方法都是属于实例的, 而非静态的或是类的方法。factory()方法可不可以是静态的方法呢?

  问答题答案

  对整个系统而言,工厂模式把具体使用new操作符的细节包装和隐藏起来。当然只要程序是用爪哇语言写的, 爪哇语言的特征在细节里一定会出现的。

  图3.(简单工厂模式定义的类图),是精减后的框架性类图,用于给出这一模式的准确而精练的定义。产品(Product)类到底会有几种,则要对每个系统作具体分析。

  这里给出问题的完整答案。描图员(Art Tracer)系统的UML如下


              系统的源代码如下

package com.javapatterns.simplefactory.exercise;

public class ArtTracer
{
 public Shape factory(String which) throws BadShapeException
 {
  if (which.equalsIgnoreCase("circle"))
  {
   return new Circle();
  }
  else if (which.equalsIgnoreCase("square"))
  {
   return new Square();
  }
  else if (which.equalsIgnoreCase("triangle"))
  {
   return new Triangle();
  }
  else
  {
   throw new BadShapeException(which);
  }
 }
}

  代码清单8. ArtTracer类的源代码。

package com.javapatterns.simplefactory.exercise;

public interface Shape
{
 void draw();

 void erase();
}

  代码清单9. Shape接口的源代码。

package com.javapatterns.simplefactory.exercise;

 public class Square implements Shape
 {
  public void draw()
  {
   System.out.println("Square.draw()");
  }

 public void erase()
 {
  System.out.println("Square.erase()");
 }
}

  代码清单10. Square类的源代码。

package com.javapatterns.simplefactory.exercise;

public class Circle implements Shape
{
 public void draw()
 {
  System.out.println("Circle.draw()");
 }

 public void erase()
 {
  System.out.println("Circle.erase()");
 }
}

  代码清单11. Circle类的源代码。

package com.javapatterns.simplefactory.exercise;

public class Triangle implements Shape
{
 public void draw()
 {
  System.out.println("Triangle.draw()");
 }

 public void erase()
 {
  System.out.println("Triangle.erase()");
 }
}

  代码清单12. Triangle类的源代码。

package com.javapatterns.simplefactory.exercise;

public class BadShapeException extends Exception
{
 public BadShapeException(String msg)
 {
  super(msg);
 }
}

  代码清单13. BadShapeException类的源代码。

  描图员(Art Tracer)系统使用方法如下

try
{
ArtTracer art = new ArtTracer();

art.factory("circle");
art.factory("square");
art.factory("triangle");

art.factory("diamond");
}
catch(BadShapeException e)
{
...
}

  注意对ArtTracer类提出菱形(diamond)请求时,会收到BadShapeException例外。

  显然factory()可以是静态的或是类的方法。本文这样介绍简单工厂模式,是为了能方便与后面介绍的工厂方法模式作一比较。
【Unity3D框架】GameFramework框架完全教程《全网最全》-专栏文章目录 最近准备学习框架,了解到GameFramework框架是国产Unity3D框架,准备学习一下,但是奈何全网关于这个框架的教程实在太少。为了让自己学习方便一些,也为了让后来者乘凉。将框架以自己的理解整理目录,并且补全教程。觉得教程有帮助别忘了一键三连哦。 阅读详情

相关推荐

Attention优化|2w字原理&图解: 从Online-Softmax到FlashAttention V1/V2/V3

本文通过原理分析和图解的方式,通俗易懂地FlashAttention系列算法。FlashAttention V1/V2在LLM领域的应用已经非常广泛,相关的论文也反复读了几遍。FA1和FA2论文非常经典,都推荐读一下(不过FA2论文中公式错误不少本文大约1.8w字,包括以下内容:0x07 分布式训推使用FlashAttention0x09 FlashAttention中MQA/GQA以及Causal Mask处理。

强化学习曾小健 5177

简单工厂模式

简单工厂模式,或称静态工厂方法模式,是类的创建模式,由一个工厂对象决定创建出哪一种产品类的实例。 一个例子,要求设计一个创建不同几何形状,如圆形,方形和三角形实例的描图员系统。每个几何图形要有画出draw()和擦去erase()两个方法。 类图如下:  Shape接口 public interface Shape { //画图形 public void draw(); ...

五月天 189

华为云计算——FusionCompute创建虚拟机

华为云计算——FusionCompute创建虚拟机

jks212454的博客 3646

阎宏博士讲解:简单工厂(Simple Factory)模式

阎宏博士讲解:简单工厂(Simple Factory)模式《Java 与模式》作者阎宏博士电子工业出版社出版第139页第12 章简单工厂(Simple Factory)模式简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式简单工厂模式是由一个工厂对象决定创建出那一种产品类的实例。12.1 工厂模式的几种形态工厂模式专门负责将大量有共同接口的

幽客独往 2701

简单工厂模式工厂模式、抽象工厂模式

一、简单工厂模式 不用设计模式并非不可以,但是用好设计模式能帮助我们更好地解决实际问题,设计模式最重要的是解耦。设计模式天天都在用,但自己却无感知。主要是学习设计模式是如何总结经验的,把经验为自己所用。学设计模式也是锻炼将业务需求转换技术实现的一种非常有效的方式。 简单工厂模式(Simple Factory Pattern)是指由一个工厂对象决定创建出哪一种产品类的实例,但它不属于 GOF,23 种设计模式简单工厂适用于工厂类负责创建的对象较少的场景,且客户端只需要传入工厂类的参数,对于如何创建对象的逻

jingan欢迎您来访 525

接口 练习

水果都能被榨成汁,在现实生活中,我们需要一个榨汁机, * 往榨汁机中的装什么水果就被榨成什么果汁,请根据描述设计一个程序 分析: * 1.定义一个接口Fruit(水果接口),其中定义一个toJuice()(变成果汁方法) 2.定义一个实现类Apple(苹果类),实现Fruit接口重写toJuice()方法,输出内容为"苹果变成苹果汁儿" 3.定义一个实现类Banana(香蕉类),实现Fruit接口重写toJuice()方法,输出内容为"香蕉变成香蕉牛奶汁儿" ...

weixin_57219176的博客 1363

设计模式--创建模式--简单工厂

设计模式大体上可以分为三类1.创建模式2.行为模式3.结构模式在本文章中首先对创建模式进行介绍:   n创建模式分为类的创建模式和对象的创建模式两种。 #对象的创建模式:是把对象的创建过程动态的委派给另一个对象,从而动态地决定客户端将得到哪些具体类的实例,以及这些类的实例是如何被创建和组合在一起的.#类的创建模式:类的创建模式使用继承关系,把类的创建延迟

wangqun2007的专栏 698

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

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

lizl的专栏 1622

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

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

cnrandy 的专栏 829

简单工厂创立模式介绍

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

xhw79的专栏 1334

zt:工厂模式简单工厂(设计模式的入门级模式—初级)

 本文综合了《thinking in Design pattern with java》,《Design pattern》,《爪哇语言简单工厂创立模式介绍》以及我自己的观点,对factory 相关的设计模式进行详细的说明。工厂模式有以下几种形态:简单工厂(Simple Factory)模式工厂方法(Factory Method)模式,又称多形工厂(Polymorphic Factory)模式

Steven_zhao的专栏 1376

抽象工厂模式代码

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

java技术之家 350

Java设计模式专辑

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

轻轻草原 118

JAVA工厂设计模式(摘自网络)

JAVA工厂设计模式(摘自网络) 一. 程序设计目标 我们组写了个简单的水果生产程序,描述农场种植水果的过程,旨在通过此次设计更进一步了解工程设计模式,加强编程的结构化能力。 开发环境:JDK1.5 开发工具:JBuilder 2006 二.程序设计介绍 1.程序结构 我们组为一个水果公司写了个简单...

weixin_30394981的博客 157

有一个农场公司,专门向市场销售各类水果,主要包括下列水果:葡萄 Grape,草莓 Stuawberry,苹果 Apple;有一个Fruit接口,包含grow生长,harvest收获和plant方法,

package com.a; /** * @author 夜灬瞬 * @date 2021年12月08日 9:58 */ public class Test16 { public static void main(String[] args) { Fruit fruit = FruitGardener.etFruit("apple"); fruit.plant(); fruit.grow(); fruit.harveat();.

heiye12138的博客 988

第四课 简单工厂模式(Simple Factory)

  第四课 简单工厂模式(Simple Factory)    工厂模式的作用就如他的名字,将大量实现共同接口的产品实例话返回,就像真正的工厂一样。工厂模式可以动态的决定将哪一个类实例化,不必实现知道每次要实例化哪一个类。工厂方式呢,有三种形态:1.       简单工厂(Simple Factory)模式:又称静态工厂方法模式,是最常见的工厂实现。2.       工厂方法(Fa

哈利路亚的收藏夹 1359

【迷人的爪哇】—带你从零开始了解Java

带你初识Java,带你爱上Java!!!!!!

weixin_62678196的博客 711

爪哇语言单态创立模式介绍

什么是模式   一个围棋下得好的人知道,好的"形"对于围棋非常重要。形是棋子在棋盘上的几何形状的抽象化。 形就是模式(Pattern),也是人脑把握和认识外界的关键。而人脑对处理模式的能力也非常高超, 人可以在几百张面孔中一下子辨认出所熟悉的脸来,就是一个例子。   简而言之,在我们处理大量问题时,在很多不同的问题中重复出现的一种质,它使得我们可以使用一种方法来描述问题实质并用本质上相同,但细节

lizl的专栏 1666

量子保密通信技术及应用研究综述.pdf

量子保密通信技术及应用研究综述.pdf

Traffic-Signal-Control-master_深度强化学习交通信号灯识别python_深度强化学习_DDPG_tr

Traffic-Signal-Control-master_深度强化学习交通信号灯识别python_深度强化学习_DDPG_tr

上一篇: 爪哇语言工厂方法创立性模式介绍
下一篇: 用JAVA实现线程等待提示框
lizl
博客等级 码龄25年 6粉丝 42原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值