/Articles

让子类处理-factory method-子类生成实例

前面实验了template method的组装方法,父类中规定了子过程和最后的组装。子过程的实现是在子类中完成的,组装是父类完成。如果改造一下这个template method,把子过程用来生成一个具体的其他类的实例,就变成了工厂方法模式。 子过程可以生成一个其他类,如果有多个template method抽象类的子类,就可以生成多个不同类型的类。工厂模式的目的是根据条件生成不同的具体的类实例。...

实例生成-builder-组装生成复杂的实例

builder和template method非常相似,就是父类定义了一个组装过程中的每一个子过程。但是不同点是:最后所有这些子过程的的组装,是由不同的人完成的。template method模式中,父类负责所有总的组装;builder模式中,这些子过程的组装是由director来完成的。 builder抽象类只负责所有子过程的方法定义。 public abstract class Builder { protected abstract void dig(); protected abstract void construct(); protected...

实例生成-singleton-每时每刻只产生一个单一的实例

singleton模式可能是最简单最容易理解的一种设计了。就是在JVM运行时内,某个类永远只有一个实例存在。比如一个用来读写property属性文件的类,在整个应用中只需要一个单实例。 public class MySingleton { private static MySingleton instance = null; private MySingleton(){ //do initialization job }; public static MySingleton getInstance(){ if...

让子类处理-template method-子类处理具体的方法

template method模式可以让我们顶一个类实现某个功能的的具体的流程,这个流程是规范的,不能被改变。每一个流程是一个方法,模板不定义方法体,方法体由不同的子类去做具体实施。 这就好比盖房这样的工程。盖房的流程是:挖地基、盖房、粉刷装饰。工程模板定义了这个流程的先后顺序,但是地基怎么挖,盖房怎么盖,由不同的房子(就是子类)的特点来决定。 加入盖房工程设计成一个类,我可以做成一个抽象类,build()方法内规定了工程的先后顺序,同时用final来限制,不允许子类重写这个方法修改顺序。...

类复用-adaptor-修复现有API和需求的差异

Java IO的SDK中用了大量的adaptor模式来解决不同格式不同方式的文件的读写。它能为客户掩盖掉底层实现的细节。在实际的开发中,它应用于这种情形: 现有的SDK/API只是一部分满足自己的需求 所以,不满足的部分只能通过适配的方法来弥补。 比如我有一个220V的电源插座,现在要为不同的设备生产不同的插头,比如手机和笔记本。220V是属于需要被改造适配的adaptee,5V的手机插头和12V的笔记本插头是adaptor。有两种适配器的设计方式。 类继承的适配器方式 旧的API无法适应新的设备 public class Power220V { public...

状态管理-observer-模式实现事件驱动

用观察者模式处理Java里的图形编程事件响应,非常好理解。多个观察者通过注册事件监听器,监听被观察者,一旦被观察者有状态改变,会发送通知给所有这些观察者去响应。举个最简单的例子,多个病人去看病,首先挂号,然后等叫号。病人就是观察者,医生就是被观察者。医生一旦发出叫号信息,所有病人会检查该叫号判断是不是自己要去看病。 我现在要设计一个用户响应的程序,需要处理鼠标的输入事件。鼠标有单击、双击、右键单击。 我先定义一个事件对象,用来表示是什么事件,这个事件用来在观察者和被观察者种传输事件对象的状态。 import java.util.EventObject; public class...

类复用-iterator-迭代模式替代循环数组

一般性地,用数组来保存同类型的对象,然后用for循环遍历这个数组就能取出所有的对象,这过程非常简单直接,很好用。 但是如果数组不适应了当前应用,开发人员决定用类似Vector或者ArrayList来保存这组对象,循环遍历就要重新改写。 迭代模式很好地解决了这个问题,循环遍历时,我不用担心对象组在内部是具体怎么保存的,到底是保存为数组还是保存为集合,完全不用操心。我只要知道统一的迭代方法就可以了。 假设我有一个果篮,里面存放了一堆苹果,我在取苹果的时候,完全不用去管苹果的堆放方式,我只要知道取完一个后自动指向下一个苹果。...

1