不错,正是模板方法模式的运用。这个类蛮简单的:首先是一个create()方法,用来产生具体类的对象,留交各具体工厂实现去实现。然后是一个Map类型的静态变量,用来存放具体工厂的实现以及他们的ID号。接着的一个方法使用来增加一个具体工厂的实现。后一个静态方法是用来获取具体对象,里面的那个Class.forName……的作用是调用以ID号为类名的类的一些静态的东西。

下面,我们来看具体的类的实现:

package polyFactory;

public class Circle implements Shape {

public void draw() {

// TODO Auto-generated method stub

System.out.println("the circle is drawing...");

}

public void erase() {

// TODO Auto-generated method stub

System.out.println("the circle is erasing...");

}

private static class Factory extends ShapeFactory

{

protected Shape create()

{

return new Circle();

}

}

static {ShapeFactory.addFactory("Circle",new Factory());}

}

这个类的其他的地方也平常得很。但就是后面的那个内部类Factory用得好。呢,这个类只做一件事,就是产生一个Circle对象,与其他类无关,就这一个条也就满足了使用内部类的条件。第二呢,这个Factory类需要是静态的,这也得要求它被使用内部类,不然,下面的ShapeFacotry.addFactory就没办法add了。而后的那个静态的语句块是用来将具体的工厂类添加到抽象的工厂里面去。在抽象工厂里调用Class.forName就会执行这个静态的语句块了。

下面仍然是一个具体类:

package polyFactory;

public class Square implements Shape {

public void draw() {

// TODO Auto-generated method stub

System.out.println("the square is drawing...");

}

public void erase() {

// TODO Auto-generated method stub

System.out.println("the square is erasing...");

}

private static class Factory extends ShapeFactory

{

protected Shape create()

{

return new Square();

}

}

static {ShapeFactory.addFactory("Square",new Factory());}

}

后,我们来测试一下:

String[] ids = new String[]{"Circle","Square","Square","Circle"};

for(int i=0;i

{

Shape shape = ShapeFactory.createShape(ids[i]);

shape.draw();

shape.erase();

}

测试结果为:

the circle is drawing...

the circle is erasing...

the square is drawing...

the square is erasing...

the square is drawing...

the square is erasing...

the circle is drawing...

the circle is erasing...

这个方法是巧妙地使用了内部类,将具体类的实现和它的具体工厂类绑定起来,由具体类的实现者在这个内部类的具体工厂里去产生一个具体类的对象,这当然容易得多。虽然需要每一个具体类都创建一个具体工厂类,但由于具体工厂类是一个内部类,这样也不会随着具体类的增加而不断增加新的工厂类,使得代码看起来很臃肿,这也是本方法不得不使用内部类的一个原因吧。

相关推荐:

来源:考试大-Java认证

责编:xxm  评论 纠错

java匿名内部类的使用场景_java匿名内部类的使用场景相关推荐

  1. java 匿名对象有引用_java 匿名内部类对象持有外部类对象的引用

    转载自:https://www.jianshu.com/p/9335c15c43cf /** * @author hgl * @data 2019年1月10日 * @description 接口 */ ...

  2. java 抽象类的匿名类_Java匿名内部类(通过继承抽象类来实现)

    3. 匿名内部类 没有名字的内部类就是匿名内部类. 3.1 匿名内部类特性 1. 匿名内部类总是默认实现某个接口或继承某个抽象类. 2.不能有构造方法,只能有一个实例. 3. 不能定义在任何静态成员. ...

  3. java 匿名类调用方法_Java匿名内部类使用与示例

    首先说为什么有匿名类(产生的使命) 两个原因 1.简化代码编写 某种情况下,类只需要扩展一个方法,没必要为了一个方法单独去写一个子类,然后然后调用子类,此时需要匿名类 2.在不同的包内的类内调用类的p ...

  4. java什么时候用反射_Java反射机制使用场景

    1 import java.io.*;2 importjava.util.Properties;3 4 /*问题描述:存在一个主板--已经定义好,不想修改其代码,还想在主板上面增加一些其他功能?5 * ...

  5. java匿名内部类返回值_java匿名内部类

    java的内部类可以玩出好多花样.介绍都挺多,我就不废话了.专门记一下困惑了我好半天的匿名内部类. 总结一下: 1.匿名内部类通常是为了省事(直接获取一个类实例,这个类实例只在此处用一次,就省得再给它 ...

  6. java 匿名内部类 参数_Java匿名内部类原理与用法详解

    本文实例讲述了Java匿名内部类原理与用法.分享给大家供大家参考,具体如下: 一 点睛 匿名内部类适合创建那种只需要一次使用的类,定义匿名内部类的语法格式如下: new 父类构造器(实参列表) | 实 ...

  7. java 匿名内部类_Java 匿名内部类的示例介绍

    匿名内部类的示例介绍 1.方法中的内部类 public class InnerClass { public void LocalOne() { class DeepInside { DeepInsid ...

  8. java培训教程:什么是匿名内部类?怎样创建匿名内部类?

    本期java教程要为大家分享的是关于java中的匿名内部类,相信很多同学在学java技术的时候有了解过,下面我们就来详细的看一下. java培训教程:什么是匿名内部类?怎样创建匿名内部类?匿名内部类是 ...

  9. 【转】java提高篇(十)-----详解匿名内部类

    原文网址:http://www.cnblogs.com/chenssy/p/3390871.html 在java提高篇-----详解内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节 ...

最新文章

  1. python读取html内容 dom获取_python学习笔记十三 JS,Dom(进阶篇)
  2. c#中datareader中HasRows属性和Read方法的区别
  3. php protobuf 性能,php中使用protobuffer
  4. Bzoj 2662: [BeiJing wc2012]冻结 dijkstra,堆,分层图,最短路
  5. 尽量使用写文本方式存储数据(pandas 和 file write效率对比)
  6. 计算机专业介绍范文英文,计算机专业个人简历英文范文
  7. 完全无人驾驶量产车Apollo Moon威马版首秀 成本降一半、能力翻10倍
  8. 利用5w1h写出高效的git commit
  9. openlayer 图层上下_OpenLayers 3 的图层体系结构
  10. 关于SqlDataReader类型的变量传值问题
  11. dbmsjobs记录表 oracle_【Oracle学习笔记】定时任务(dbms_job)
  12. 《自适应滤波器原理》西蒙.赫金 百度云
  13. PMBOK(第五版)学习笔记 —— 3 项目管理过程
  14. PR1:初识PR界面
  15. 最薄翻转笔记本 联想Yoga13-IFI 6700
  16. 文本预处理:拼写纠错
  17. 芬美意2020财年集团收入38.78亿瑞士法郎,增长2.8%
  18. 网络安全笔记-99-渗透-业务安全
  19. ZOJ 3380 Patchouli's Spell Cards(概率DP)
  20. VVC代码学习之自定义数据结构阅读4

热门文章

  1. 301重定向的实现方法
  2. 判断JavaScript对象为null或者属性为空
  3. 【转】一篇文章读懂人力资源三支柱体系(COE・BP・SSC)
  4. 控制ASP.NET Web API 调用频率与限流
  5. GUI for git|SourceTree|入门基础
  6. BPSK信号matlab,BPSK信号调制解调与MATLAB仿真.docx
  7. 高考 | 满分作文:《我们都是读“书”人》
  8. Thinkphp5中异常处理不返回页面返回Json格式的字符串
  9. Linux下 运行Jmeter (含一个jmeter简单示例)
  10. python迭代列表_迭代建立列表的最python方法?