读书人

研磨设计方式 之 原型模式(Prototype

发布时间: 2012-10-31 14:37:31 作者: rapoo

研磨设计模式 之 原型模式(Prototype)2 ——跟着cc学设计系列

?

(2)应用原型模式来解决的思路

仔细分析上面的问题,在saveOrder方法里面,已经有了订单接口类型的对象实例,是从外部传入的,但是这里只是知道这个实例对象的种类是订单的接口类型,并不知道其具体的实现类型,也就是不知道它到底是个人订单还是企业订单,但是现在需要在这个方法里面创建一个这样的订单对象,看起来就像是要通过接口来创建对象一样。

原型模式就可以解决这样的问题,原型模式会要求对象实现一个可以“克隆”自身的接口,这样就可以通过拷贝或者是克隆一个实例对象本身,来创建一个新的实例。如果把这个方法定义在接口上,看起来就像是通过接口来创建了新的接口对象。

这样一来,通过原型实例创建新的对象,就不再需要关心这个实例本身的类型,也不关心它的具体实现,只要它实现了克隆自身的方法,就可以通过这个方法来获取新的对象,而无须再去通过new来创建。

9.2.1? 模式结构和说明

原型模式的结构如图9.1所示:

?研磨设计方式 之 原型模式(Prototype)2 ——跟着cc学设计系列

图9.1? 原型模式结构示意图

Prototype

声明一个克隆自身的接口,用来约束想要克隆自己的类,要求它们都要实现这里定义的克隆方法。

ConcretePrototype

实现Prototype接口的类,这些类真正实现了克隆自身的功能。

Client

使用原型的客户端,首先要获取到原型实例对象,然后通过原型实例克隆自身来创建新的对象实例。

9.2.3? 原型模式示例代码

(1)先来看看原型接口的定义,示例代码如下:

/**

?* 声明一个克隆自身的接口

?*/

public interface Prototype {

??? /**

??? ?* 克隆自身的方法

??? ?* @return 一个从自身克隆出来的对象

??? ?*/

??? public Prototype clone();

}

(2)接下来看看具体的原型实现对象,示例代码如下:

/**

?* 克隆的具体实现对象

?*/

public class ConcretePrototype1 implements Prototype {

??? public Prototype clone() {

?????? //最简单的克隆,新建一个自身对象,由于没有属性,就不去复制值了

?????? Prototype prototype = new ConcretePrototype1();

?????? return prototype;

??? }

}

/**

?* 克隆的具体实现对象

?*/

public class ConcretePrototype2 implements Prototype {

??? public Prototype clone() {

?????? //最简单的克隆,新建一个自身对象,由于没有属性,就不去复制值了

?????? Prototype prototype = new ConcretePrototype2();

?????? return prototype;

??? }

}

?????? 为了跟上面原型模式的结构示意图保持一致,因此这两个具体的原型实现对象,都没有定义属性。事实上,在实际使用原型模式的应用中,原型对象多是有属性的,克隆原型的时候也是需要克隆原型对象的属性的,特此说明一下。

(3)再看看使用原型的客户端,示例代码如下:

/**

?* 使用原型的客户端

?*/

public class Client {

??? /**

??? ?* 持有需要使用的原型接口对象

??? ?*/

??? private Prototype prototype;

??? /**

??? ?* 构造方法,传入需要使用的原型接口对象

??? ?* @param prototype 需要使用的原型接口对象

??? ?*/

??? public Client(Prototype prototype){

?????? this.prototype = prototype;

??? }

??? /**

??? ?* 示意方法,执行某个功能操作

??? ?*/

??? public void operation(){

?????? //会需要创建原型接口的对象

?????? Prototype newPrototype = prototype.clone();

??? }

}

9.2.4? 使用原型模式重写示例

?????? 要使用原型模式来重写示例,先要在订单的接口上定义出克隆的接口,然后要求各个具体的订单对象克隆自身,这样就可以解决:在订单处理对象里面通过订单接口来创建新的订单对象的问题。

?????? 使用原型模式来重写示例的结构如图9.2所示:

?研磨设计方式 之 原型模式(Prototype)2 ——跟着cc学设计系列

图9.2? 使用原型模式来重写示例的结构示意图

下面一起来看看具体的实现。

(1)复制谁和谁来复制的问题

有了一个对象实例,要快速的创建跟它一样的实例,最简单的办法就是复制?这里又有两个小的问题

读书人网 >软件开发

热点推荐