Eclipse Template与模式

转载 2011年01月21日 10:59:00
Eclipse Template对我们是一个相当有用的工具,能节省我们很多写重复代码的时间;也能减少我们对copy&paste的使用。
关于Eclipse Templage的基础知识,详见我的Blog:Eclipse Template用法探讨
而模式在我们的面向对象的编程的一个重要手段,特别是Java编程,更加离不开模式。然而,在模式的使用过程中,我们也会遇到很多重复代码的问题。这篇文章就是试图将Eclipse Template和模式结合起来,来解决我们在使用模式过程中遇到的重复代码的问题。
本文将要阐述将Eclipse Template和模式结合起来的相关问题,所以首先要求大家使用的IDE是Eclipse,如果有人使用的是其他的IDE,如netbean等,那么请首先熟悉该IDE的Template的用法。其次,本文还要求大家有模式基础,本文所涉及到的模式,由于文章内容所限,不会说明该模式的来龙去脉,如果不熟悉,请大家查阅相关资料。
单态模式是我们比较常用的一种模式,阎宏博士在其著作:《Java与模式》中,将单态模式分为三种,即:饿汉式单态模式、懒汉式单态模式和登记式单态模式。
其中,饿汉式单态模式的示例代码为:
public class EagerSingleton
{
private static final EagerSingleton m_instance = new EagerSingleton();
/**
* 私有的默认构造子
*/
private EagerSingleton() { }
/**
* 静态工厂方法
*/
public static EagerSingleton getInstance()
{
return m_instance;
}
……
}
该示例代码是一段相当实用的代码,几乎每一个饿汉式单态模式的应用都会有上面的代码出现,所不同的是类名,在实际代码中,你肯定不会叫EagerSingleton。然后不同的是被省略号省掉的部分,用户编写该类的业务逻辑。
如果我们经常使用饿汉式单态模式的话,就会发现编写上面的代码是十分枯燥的重复劳动。如果我们使用copy&paste,又不得不对代码中涉及到的类名做一次又一次的修改。
现在如果我们使用Eclipse Template工具,则该问题的解决变得十分简单。
首先,我们设计一个名为:EagerSingleton的Template,其Pattern为:
    privatestaticfinal $ m_instance = new $();
    /**
    *私有的默认构造子
    */
    private $() { }
    /**
    *静态工厂方法
    */
    publicstatic $ getInstance()
    {
       return m_instance;
    }
    $
这样,我们就可以使用该Template,在类的代码的适当的位置输入Template名:EagerSingleton,然后点击Alt+/,如下图:
最后,得到结果为:
可以看到上面的结果,既不需要copy&paste,也不需要一个个地去修改类名为:TemplateTest。使用了Eclipse Template,我们可以很轻松的解决重复代码的问题。
下面我们来看看懒汉式单态模式,其示例代码如下:
public class LazySingleton
{
private static LazySingleton m_instance = null;
/**
* 私有的默认构造子,保证外界无法直接实例化
*/
private LazySingleton() { }
/**
* 静态工厂方法,返还此类的惟一实例
*/
synchronized public static LazySingleton getInstance()
{
if (m_instance == null)
{
m_instance = new LazySingleton();
}
return m_instance;
}
……
}
同上面的饿汉式单态模式一样,这个类前面的代码在每一个使用了该模式的类里都一样,属于重复代码,后面被省略号省掉的部分才是各个类自己的业务逻辑。
我们来设计一个名为LazySingleton的Template,其pattern为:
    privatestatic $ m_instance = null;
    /**
    *私有的默认构造子,保证外界无法直接实例化
    */
    private $() { }
    /**
    *静态工厂方法,返还此类的惟一实例
    */
    synchronizedpublicstatic $ getInstance()
    {
       if (m_instance == null)
       {
           m_instance = new $();
       }
       return m_instance;
    }
    $
有关这个Template的测试结果,在这里就不再给出,请大家自己测一测,一定能深入体会到Eclipse Template的精妙之处。
第三种是登记式的单态模式,是为了解决单态模式类不能被继承而设计的一个新的单态模式,其示例代码如下:
public class RegSingleton
{
static private HashMap m_registry = new HashMap();
static
{
RegSingleton x = new RegSingleton();
m_registry.put( x.getClass().getName() , x);
}
/**
* 保护的默认构造子
*/
protected RegSingleton() {}
/**
* 静态工厂方法,返还此类惟一的实例
*/
static public RegSingleton getInstance(String name)
{
if (name == null)
{
name = "RegSingleton";
}
if (m_registry.get(name) == null)
{
try
{
m_registry.put( name,Class.forName(name).newInstance() ) ;
}
catch(Exception e)
{
System.out.println("Error happened.");
}
}
return (RegSingleton) (m_registry.get(name) );
}
……
}
        同样,每一个应用该模式的类的自身的业务逻辑被代码中的省略号省略掉。省略号前面的代码是每一个应该该模式的类的重复代码。
        这个模式的重复代码却更加的庞大,而我们使用Eclipse Template却更加地显示出了Eclipse Template的优越性。下面我们看看该Template是怎么设计的:
      我们还是设计一个名为:RegSingleton的Template,其Pattern如下:
    static private HashMap m_registry = new HashMap();
    static
    {
       $ x = new $();
       m_registry.put( x.getClass().getName() ,x);
    }
    /**
    *保护的默认构造子
    */
    protected $() {}
    /**
    *静态工厂方法,返还此类惟一的实例
    */
    staticpublic $ getInstance(String name)
    {
       if (name == null)
       {
           name ="$.$";
       }
       if (m_registry.get(name) == null)
       {
           try
           {
              m_registry.put( name,Class.forName(name).newInstance() ) ;
           }
           catch(Exception e)
           {
              System.out.println("Error happened.");
           }
       }
       return ($) (m_registry.get(name) );
    }
    $
 
        大家不妨测试一下看看,是不是Eclipse Template显示出来巨大的优越性?
        通过上面的三个例子,大家都看到了将Eclipse Template和模式结合起来的巨大威力,相信也引起了大家极大的兴趣。下面我们再结合几个例子来看看Eclipse Template和模式结合起来的效果。
        结合了反射的工厂模式非常灵活,可以被广泛的使用。这个模式在我的Blog:“模式”专栏中有阐述。
        该模式的示例代码如下:
public class Factory {
public static Animal getInstance(String name)
{
try
{
Class cls = Class.forName(name);
return (Animal)cls.newInstance();
}
catch(Exception e)
{
e.printStackTrace();
return null;
}
}
}
      对于这段代码,我们可以设计一个名为:DynaFactory的Template,其Pattern为:
    publicstatic ${interface} getInstance(String name)
    {
       try
       {
           Class cls = Class.forName(name);
           return (${interface})cls.newInstance();
       }
       catch(Exception e)
       {
           e.printStackTrace();
           returnnull;
       }
    }
        这个Template中的参数$代表的是该工厂类生产的产品的接口,可以是你的实际项目中的任何接口,你只需要在代码中用实际的接口代替$即可,如下:
 
      图中正在将interface参数修改为Animal。
 
      还有一个经典例子是多态工厂模式,关于该模式的阐述,我在我的Blog:幕后英雄的用武之地——浅谈Java内部类的四个应用场景中的第四个例子中讲到。
      要使用该模式,有多达两处的代码重复,请看下面的示例:

abstract class ShapeFactory {

 protected abstract Shape create();

 private static Map factories = new HashMap();

 public static void

  addFactory(String id, ShapeFactory f) {

    factories.put(id, f);

 }

 // A Template Method:

 public static final

  Shape createShape(String id) {

    if(!factories.containsKey(id)) {

      try {

        // Load dynamically

        Class.forName("c05.shapefact2." + id);

      } catch(ClassNotFoundException e) {

        throw new RuntimeException(

          "Bad shape creation: " + id);

      }

      // See if it was put in:

      if(!factories.containsKey(id))

        throw new RuntimeException(

          "Bad shape creation: " + id);

    }

    return

      ((ShapeFactory)factories.get(id)).create();

 }

}
该代码有相当大的重复性,除了类名:ShapeFactory在每一个应用中不一样,还有接口:Shape不一样,还有就是包:c05.shapefact2 不一样。
下面是另外的一段代码:

class Circle implements Shape {

 private Circle() {}

 public void draw() {

    System.out.println("Circle.draw");

  }

 public void erase() {

    System.out.println("Circle.erase");

 }

 private static class Factory

  extends ShapeFactory {

    protected Shape create() {

      return new Circle();

    }

 }

 static {

    ShapeFactory.addFactory(

      "Circle", new Factory());

 }

}

在这段代码里,内部类:Factory也是重复的。
下面我们分别用两个Template来代表它们,首先设计一个名为:PolyFactory的Template,其Pattern为:
    protectedabstract ${interface} create();
    privatestatic Map factories = new HashMap();
    publicstaticvoid addFactory(String id, $ f)
    {
       factories.put(id, f);
    }
    // A Template Method:
    publicstaticfinal ${interface} createProduct(String id)
    {
       if(!factories.containsKey(id)) {
    try {
            // Load dynamically
            Class.forName("$." + id);
    } catch(ClassNotFoundException e) {
            thrownew RuntimeException("Bad product creation: " + id);
    }
    // See if it was put in:
    if(!factories.containsKey(id))
            thrownew RuntimeException("Bad product creation: " + id);
       }
       return (($)factories.get(id)).create();
    }
使用该Template后的结果为:
 
第二个类的重复代码也设计成一个名为:PolyProduct的Template,其Pattern为:
private $() {}
    privatestaticclass Factory extends $
    {
       protected ${interface} create()
       {
        returnnew $();
       }
    }
    static
    {
       $.addFactory("$", new Factory());
    }
使用该模式后的结果为:
像这样的例子,在模式中真是比比皆是,最后以一个代理模式的例子来作为本文的结束,以后大家在使用模式的时候,不妨将模式和Eclipse Template结合起来使用,用来缩短我们的开发时间。
代理模式在我的Blog:代理模式、动态代理和面向方面中有过讲述,在那篇文字的最后,有这样一段代码:
public class ProxyImpl extends BaseProxy {
protected ProxyImpl(Object o)
{
super(o);
}
public static Object getInstance(Object foo)
{
return getInstance(foo,new ProxyImpl(foo));
}
//委派前的动作
public void doBegin() {
// TODO Auto-generated method stub
System.out.println("begin doing....haha");
}
//委派后的动作
public void doAfter() {
// TODO Auto-generated method stub
System.out.println("after doing.....yeah");
}
}
        这个动态代理经过了模板方法模式的简化,已经相当的简单了,但仍然有重复的代码。可以做如下的简化。
我们设计一个名为:DynaProxy的Template,其Pattern为:
    protected $(Object o)
    {
       super(o);
    }
    publicstatic Object getInstance(Object foo)
    {
       return getInstance(foo,new $(foo));
    }
好了,到此本文该结束了.Eclipse Template的确是一个好的工具,能极大的减轻我们code重复代码.模式是面向对象编程的精华所在.而将模式和Eclipse Template则更加的妙不可言.还等什么呢?赶快行动吧!

相关文章推荐

Eclipse Template与模式

  • 2008年08月07日 15:14
  • 192KB
  • 下载

eclipse editor template file

  • 2012年10月17日 13:47
  • 801B
  • 下载

eclipse功能<template>(模板)学习。e.g : 快速在代码中插入时间戳

说些题外话。 自己属于半路出家入行码农的类型,基础算不上好,需要大量的时间夯实。 幸好,赶上网易云课堂开放。可以花费些时间,来好好学习一下。 在此,也是特别推荐有心学习coding的同学,可以去...
  • czh500
  • czh500
  • 2016年06月21日 00:20
  • 430

Template(模板模式)

  • 2014年06月06日 11:25
  • 8KB
  • 下载

eclipse 自动生成代码注释template

模版一: /** * ${tags} *//** * @param ${param} the ${bare_field_name} to set *//* * *//** * $...

Eclipse Template用法探讨

Eclipse Template用法探讨

Eclipse MyEclipse Code Template 设置

设置注释模板的入口: Window->Preference->Java->Code Style->Code Template 然后展开Comments节点就是所有需设置注释的元素啦。现就每一个元素逐一...

设计模式之模板方法(Template)

  • 2011年07月07日 09:39
  • 10KB
  • 下载

玩转Eclipse — 自动代码生成的Java Code Template

当代码写到一定程度之后,就会发现很多代码都被重复地敲了N多遍,甚至毫不夸张地说:闭着眼睛都能敲出来。大量地敲这些重复地代码,除了锻炼敲键盘的速度,基本上没有其他益处,但是长期下来会浪费很多时间,降低了...

Eclipse Code Template 设置

设置注释模板的入口: Window->Preference->Java->Code Style->Code Template 然后展开Comments节点就是所有需设置注释的元素啦。现就每一个元素逐一...
  • j2eelamp
  • j2eelamp
  • 2011年12月06日 18:48
  • 12344
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Eclipse Template与模式
举报原因:
原因补充:

(最多只允许输入30个字)