Eclipse Template对我们是一个相当有用的工具,能节省我们很多写重复代码的时间;也能减少我们对copy&paste的使用。
而模式在我们的面向对象的编程的一个重要手段,特别是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为:
private
static
final
$ m_instance =
new
$();
/**
*
私有的默认构造子
*/
private
$() { }
/**
*
静态工厂方法
*/
public
static
$ 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为:
private
static
$ m_instance =
null
;
/**
*
私有的默认构造子,保证外界无法直接实例化
*/
private
$() { }
/**
*
静态工厂方法,返还此类的惟一实例
*/
synchronized
public
static
$ 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
$() {}
/**
*
静态工厂方法,返还此类惟一的实例
*/
static
public
$ 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为:
public
static
${
interface
} getInstance(String name)
{
try
{
Class cls = Class.forName(name);
return
(${
interface
})cls.newInstance();
}
catch
(Exception e)
{
e.printStackTrace();
return
null
;
}
}
这个Template中的参数$代表的是该工厂类生产的产品的接口,可以是你的实际项目中的任何接口,你只需要在代码中用实际的接口代替$即可,如下:
图中正在将interface参数修改为Animal。
要使用该模式,有多达两处的代码重复,请看下面的示例:
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为:
protected
abstract
${
interface
} create();
private
static
Map factories =
new
HashMap();
public
static
void
addFactory(String id, $ f)
{
factories.put(id, f);
}
// A Template Method:
public
static
final
${
interface
} createProduct(String id)
{
if
(!factories.containsKey(id)) {
try
{
// Load dynamically
Class.forName(
"$."
+ id);
}
catch
(ClassNotFoundException e) {
throw
new
RuntimeException(
"Bad product creation: "
+ id);
}
// See if it was put in:
if
(!factories.containsKey(id))
throw
new
RuntimeException(
"Bad product creation: "
+ id);
}
return
(($)factories.get(id)).create();
}
使用该Template后的结果为:
第二个类的重复代码也设计成一个名为:PolyProduct的Template,其Pattern为:
private
$() {}
private
static
class
Factory
extends
$
{
protected
${
interface
} create()
{
return
new
$();
}
}
static
{
$.addFactory(
"$"
,
new
Factory());
}
使用该模式后的结果为:
像这样的例子,在模式中真是比比皆是,最后以一个代理模式的例子来作为本文的结束,以后大家在使用模式的时候,不妨将模式和Eclipse Template结合起来使用,用来缩短我们的开发时间。
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);
}
public
static
Object getInstance(Object foo)
{
return
getInstance(foo,
new
$(foo));
}
好了,到此本文该结束了.Eclipse Template的确是一个好的工具,能极大的减轻我们code重复代码.模式是面向对象编程的精华所在.而将模式和Eclipse Template则更加的妙不可言.还等什么呢?赶快行动吧!
分享到:
相关推荐
A_FactoryMethod、B_AbstractFactory、C_Singleton、D_Builder、E_Prototype、F_Adaper、G_Decorator、H_Proxy、I_Facade、J_Bridge、K_Composite、L_Flyweight、M_Strategy、N_TemplateMethod、O_Observer、P_...
比如,当你在类内部时,Eclipse会提供与类相关的模板,而在方法内则会提供与方法相关的模板。 使用模板的一大优势在于可以避免手动输入常见的代码结构,特别是在处理大量重复性工作时。例如,当需要创建多个相似的...
标签“源码”表明这个压缩包可能包含一些示例源代码,这些代码可能用于展示特定的编程概念、设计模式或者是Eclipse的某些特性。而“工具”标签则暗示了这些资源可能与开发者工具的使用有关,Eclipse本身就是一款强大...
- **Template模式的应用**:`JdbcTemplate`是Template设计模式的一个实例,它抽象出数据库操作的共性部分,将特定的SQL语句和结果处理留给开发者,从而实现了自动化。 总结来说,Eclipse创建Spring应用时,开发者...
#### 一、模板(Template)快捷键 - **快捷键**: Alt + / - **配置路径**: 窗口 -> 喜好设定 -> 工作台 -> 按键 -> 编辑 -> 内容辅助 - **个人习惯**: Shift+SPACE - **功能简介**: 在编写代码时,输入特定的模板...
1. Django框架:Django遵循MVT(Model-View-Template)架构模式,使得开发者能快速构建高效、可维护的Web应用。Model代表数据模型,是数据库的抽象层;View负责业务逻辑和数据展示;Template则是视图渲染,处理HTML...
这个压缩包“设计模式实现代码”包含的是作者在学习设计模式过程中编写的实践代码,使用Eclipse开发环境,解压后可以直接运行,便于理解和学习。 设计模式分为三大类:创建型模式(Creational Patterns)、结构型...
开发工具,如IDEA或Eclipse,可以帮助开发者更好地应用设计模式。它们提供了代码模板、重构功能,以及对设计模式的识别和可视化,从而帮助开发者遵循最佳实践。 7. **阅读与实践** 阅读《JAVA与模式》这样的书籍...
此外,还有其他设计模式,如模板方法(Template Method)、访问者(Visitor)、迭代器(Iterator)、命令(Command)、备忘录(Memento)、解释器(Interpreter)和享元(Flyweight)。每个模式都有其特定的使用场景...
- 模板方法模式(Template Method Pattern):定义一个操作中的算法骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 以上就是《Head First设计模式》中涉及的...
1. **Template**:使用Alt+/或者个人习惯的Shift+SPACE可以调出内容辅助,例如输入`sysout`后自动完成`System.out.println();`。模板的格式可以在`窗口->喜好设定->Java->编辑器->模板`中自定义。 2. **程序代码...
- **Word文档与代码同步**:Eclipse中的代码格式在复制粘贴到Word时会保留,包括字体、颜色和缩进。 4. **外挂篇** - **外挂安装**:将下载的插件解压,将其中的`features`和`plugins`目录内容复制到Eclipse对应...
7. **版本控制**:虽然没有明确提到,但Eclipse通常与版本控制系统如Git集成,用于代码版本管理和协作开发。 8. **构建过程**:在Eclipse中,开发者可以通过构建操作(Build操作)将源代码编译成可执行文件。这通常...
此外,"Template.zip"还可能包含项目配置文件,如`.cproject`(Eclipse)、`.ide`(Keil MDK)或`.platformio.ini`(PlatformIO),这些文件用于配置编译器、链接器选项以及调试设置。对于团队协作和版本控制,使用...
- **模板方法模式(Template Method)**:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。 - **观察者模式(Observer)**:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的...
Eclipse是一个广泛使用的Java集成开发环境,支持直接导入和运行项目,因此这个压缩包文件"pattern23"很可能是包含每个设计模式的Java实现,每个模式作为一个独立的类或模块,方便开发者学习和参考。通过阅读和运行...
- 首次使用时,系统会询问执行模式,设置后,再次按此热键将按照之前的设置快速执行程序。 ##### 4. **自动导入所需的类** - **快捷键**: Ctrl+Shift+O - **功能说明**: - 当在程序中使用未导入的类时,例如:`...