原型模式属于对象的创建模式。
1. 定义
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.
2. 工作原理
通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象请求原型对象拷贝它们自己来实施创建.
3. 使用方法
Java语言的构件模型直接支持原始模型模式.所有的JavaBean都继承自java.lang.Object,而Object类提供一个clone()方法,可以将一个JavaBean对象复制一份.但是,这个JavaBean必须实现一个标识接口Cloneable,表明这个JavaBean支持复制.
4. 经典应用场景
孙悟空在与黄风怪的战斗中,使用了一个身外身的手段,叫声"变",变出来百来个行者.这中手段在面向对象领域里就是原型模式.
嘿嘿,我也用这种方法来“变”出几个Amigo来,嘻嘻,一个去工作,一个去谈恋爱,一个去跟朋友玩,一个去跟家人逛吧......
看我的......
/** */
/**
* 设计模式-原型模式
*
@author
Amigo Xie(xiexingxing1121@126.com)
*
@since
2007/03/13 22:20
*/
class
CloneAmigo
implements
Cloneable
{
/** */
/**
身高(单位:cm)
*/
private
int
height;
/** */
/**
体重(单位:kg)
*/
private
int
weight;
/** */
/**
年龄
*/
private
int
age;
/** */
/**
* 构造函数
*
@param
height
*
@param
weight
*
@param
age
*/
public
CloneAmigo(
int
height,
int
weight,
int
age)
{
this
.height
=
height;
this
.weight
=
weight;
this
.age
=
age;
}
public
Object clone()
{
//
创建一个本类对象,并返回给调用者
CloneAmigo temp
=
new CloneAmigo(height, weight, age);
return (Object)temp;
}
public
void
setHeight(
int
height)
{
this
.age
=
age;
}
pubiic
int
getHeight()
{
return
height;
}
public
void
setWeight(
int
weight)
{
this
.weight
=
weight;
}
public
int
getWeight()
{
return
weight;
}
public
void
setAge(
int
age)
{
this
.age
=
age;
}
public
void
getAge()
{
return
age;
}
}
测试类的代码如下:
public
class
Client
{
public
static
void
main(String[] args)
{
CloneAmigo amigo1
=
new CloneAmigo (158, 45, 24);
//通过对一个Amigo进行克隆得到第二个Amigo
CloneAmigo amigo2 = (CloneAmigo ) amigo1.clone();
System.out.println("第一个Amigo的身高: " + amigo1.getHeight());
System.out.println("第二个Amigo的身高: " + amigo2.getHeight());
System.out.println("第一个Amigo的体重: " + amigo1.getWeight());
System.out.println("第二个Amigo的体重: " + amigo2.getWeight());
System.out.println("第一个Amigo的年龄: " + amigo1.getAge());
System.out.println("第二个Amigo的年龄: " + amigo2.getAge());
}
}
从运行结果可看出两个Amigo的身高、体重、年龄都是一样的。
5. 重点关注----克隆满足的条件
1)克隆的对象与原对象不是同一个对象;
2)克隆对象与原对象的类型一样;
3)如果对象x的equals()方法定义恰当的话,那么x.clone().equals(x)应当是成立的。
参考书籍:《Java与模式》
《Patterns in Java》
posted on 2007-03-13 23:20
阿蜜果 阅读(3104)
评论(6) 编辑 收藏 所属分类:
Design Pattern