原型模式属于对象的创建模式。
1. 定义
     用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.
2. 工作原理
      通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象请求原型对象拷贝它们自己来实施创建.
      
3. 使用方法
     Java语言的构件模型直接支持原始模型模式.所有的JavaBean都继承自java.lang.Object,而Object类提供一个clone()方法,可以将一个JavaBean对象复制一份.但是,这个JavaBean必须实现一个标识接口Cloneable,表明这个JavaBean支持复制.
4. 经典应用场景
    孙悟空在与黄风怪的战斗中,使用了一个身外身的手段,叫声"变",变出来百来个行者.这中手段在面向对象领域里就是原型模式.
    嘿嘿,我也用这种方法来“变”出几个Amigo来,嘻嘻,一个去工作,一个去谈恋爱,一个去跟朋友玩,一个去跟家人逛吧......
    看我的......
		
				 
				 /** */
				
						/**
				/** */
				
						/**
						
								
								 * 设计模式-原型模式
 * 设计模式-原型模式
 * 
						@author
						 Amigo Xie(xiexingxing1121@126.com)
 * 
						@author
						 Amigo Xie(xiexingxing1121@126.com)
 * 
						@since
						 2007/03/13 22:20
 * 
						@since
						 2007/03/13 22:20
 */
 
						*/
				
				
						
						 
						 class
				 CloneAmigo 
				implements
				 Cloneable
				
				class
				 CloneAmigo 
				implements
				 Cloneable 
				
						 {
				
				
						{

 /** */
						
								/**
								 身高(单位:cm)
								*/
    
						/** */
						
								/**
								 身高(单位:cm)
								*/
						
						
								
								 private
						 
						int
						 height;
    
						private
						 
						int
						 height;
 
    

 /** */
						
								/**
								 体重(单位:kg)
								*/
    
						/** */
						
								/**
								 体重(单位:kg)
								*/
						
						
								
								 private
						 
						int
						 weight;
    
						private
						 
						int
						 weight;
 
    

 /** */
						
								/**
								 年龄
								*/
    
						/** */
						
								/**
								 年龄
								*/
						
						
								
								 private
						 
						int
						 age;
    
						private
						 
						int
						 age;


 /** */
						
								/**
    
						/** */
						
								/**
								
										
										 * 构造函数
     * 构造函数
 * 
								@param
								 height
     * 
								@param
								 height 
 * 
								@param
								 weight
     * 
								@param
								 weight
 * 
								@param
								 age
     * 
								@param
								 age
 */
     
								*/
						
						
								
								 
								 public
						 CloneAmigo(
						int
						 height, 
						int
						 weight, 
						int
						 age)
    
						public
						 CloneAmigo(
						int
						 height, 
						int
						 weight, 
						int
						 age) 
						
								 {
						
						
								{
 this
								.height 
								=
								 height;
        
								this
								.height 
								=
								 height;
 this
								.weight 
								=
								 weight;
        
								this
								.weight 
								=
								 weight;
 this
								.age 
								=
								 age;
        
								this
								.age 
								=
								 age;  
 }
    }
						
						
								
								 
    

 public
						 Object clone()
    
						public
						 Object clone() 
						
								 {
						
						
								{
 //
								创建一个本类对象,并返回给调用者
        
								//
								创建一个本类对象,并返回给调用者
								
										
										 CloneAmigo temp 
								=
								 
								new  CloneAmigo(height, weight, age);
 
								        CloneAmigo temp 
								=
								 
								new  CloneAmigo(height, weight, age);
 return (Object)temp;
        return (Object)temp;
 }
    }
						
								
								 
								
								 
								 public
						 
						void
						 setHeight(
						int
						 height)
    
						public
						 
						void
						 setHeight(
						int
						 height) 
						
								 {
						
						
								{    
 this
								.age 
								=
								 age;
        
								this
								.age 
								=
								 age;
 }
    }
						
						
								
								 
								
								 
								 pubiic 
						int
						 getHeight()
    pubiic 
						int
						 getHeight() 
						
								 {
						
						
								{
 return
								 height;
        
								return
								 height;
 }
    }
						
						
								
								 
								
								 
								 public
						 
						void
						 setWeight(
						int
						 weight)
    
						public
						 
						void
						 setWeight(
						int
						 weight) 
						
								 {
						
						
								{
 this
								.weight 
								=
								 weight;
        
								this
								.weight 
								=
								 weight;
 }
    }
						
						
								
								 
								
								 
								 public
						 
						int
						 getWeight()
    
						public
						 
						int
						 getWeight() 
						
								 {
						
						
								{
 return
								 weight;
        
								return
								 weight;
 }
    }
						
						
								
								 
								
								 
								 public
						 
						void
						 setAge(
						int
						 age)
    
						public
						 
						void
						 setAge(
						int
						 age) 
						
								 {
						
						
								{
 this
								.age 
								=
								 age;
        
								this
								.age 
								=
								 age;
 }
    }
						
						
								
								 
								
								 
								 public
						 
						void
						 getAge()
    
						public
						 
						void
						 getAge() 
						
								 {
						
						
								{
 return
								 age;
        
								return
								 age;
 }
    }
						
						
								
								 
								
								 }
}
				
				
						
						 
				
		 
		    测试类的代码如下:
		
				 
				 public
				 
				class
				  Client
				public
				 
				class
				  Client 
				
						 {
				
				
						{

 public
						 
						static
						 
						void
						 main(String[] args)
    
						public
						 
						static
						 
						void
						 main(String[] args) 
						
								 {
						
						
								{
 CloneAmigo amigo1 
								=
								 
								new  CloneAmigo (158, 45, 24);
        CloneAmigo amigo1 
								=
								 
								new  CloneAmigo (158, 45, 24);
 //通过对一个Amigo进行克隆得到第二个Amigo
        //通过对一个Amigo进行克隆得到第二个Amigo
 CloneAmigo amigo2 = (CloneAmigo ) amigo1.clone();
        CloneAmigo amigo2 = (CloneAmigo ) amigo1.clone();
 System.out.println("第一个Amigo的身高: " + amigo1.getHeight());
        System.out.println("第一个Amigo的身高: " + amigo1.getHeight());
 System.out.println("第二个Amigo的身高: " + amigo2.getHeight());
        System.out.println("第二个Amigo的身高: " + amigo2.getHeight());

 System.out.println("第一个Amigo的体重: " + amigo1.getWeight());
        System.out.println("第一个Amigo的体重: " + amigo1.getWeight());
 System.out.println("第二个Amigo的体重: " + amigo2.getWeight());
        System.out.println("第二个Amigo的体重: " + amigo2.getWeight());

 System.out.println("第一个Amigo的年龄: " + amigo1.getAge());
        System.out.println("第一个Amigo的年龄: " + amigo1.getAge());
 System.out.println("第二个Amigo的年龄: " + amigo2.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 
阿蜜果 阅读(3136) 
评论(6)  编辑  收藏  所属分类: 
Design Pattern