设计模式篇章七——原型模式

原型模式的介绍

一种创建型的设计模式,通过一个对象的实例来创建一个与该对象相同的实例对象,本质上就是通过对象来创建一个对象(被创建的对象是原对象的拷贝)。

原型模式参与的角色

角色功能
抽象的原型类是所有具体原型类的抽象或者一个接口,内部拥有一个克隆自己方法
具体原型类实现了抽象的原型,拥有克隆自己的方法
客户端调用具体原型类的克隆方法,实现对象的克隆

原型模式的UML

原型模式

相关案例

嗯又是小明,今天他的寝室钥匙一不小心弄掉了,他借来他室友的钥匙准备去配钥匙,下面我们来为他实现这个配钥匙的过程。
分析:首先我们需要明确在这个案例中三个角色分别是什么。
抽象原型类角色:钥匙的抽象
具体原型类角色:小明的寝室钥匙
客户端角色:配钥匙处。
(1)抽象原型类角色的代码:

package prototype.model;
/**
 * @Introduction 该类是抽象原型类角色,在该案例中是抽象的钥匙类,创建了一个克隆自身的方法。
 */
public abstract class AbstractKey {
	
	/**抽象的克隆方法*/
	public abstract AbstractKey clone();
	public abstract void show();
}

(2)具体原型类角色的代码(小明所在寝室的钥匙):

package prototype.model;
/**
 * @Introduction 继承了AbstractKey抽象类,重写了show和clone方法。
 */
public class KeyOfXiaoMing extends AbstractKey{
	
	/**重写相关方法*/
	@Override
	public AbstractKey clone(){
		return new KeyOfXiaoMing();
	}
	@Override
	public void show(){
		System.out.println("小明所在寝室的钥匙");
	}
}

(3)客户端代码(配钥匙的过程):

package prototype.model;
/**
 * @Introduction 该类是客户端角色类,在该案例中模拟了配钥匙的过程,展现了原型模式的使用
 */
public class MatchKey {
	public static void main(String[] args){ 
		AbstractKey key=null;                       //这是小明需要配的钥匙,现在还没有配(没有实例化)
		KeyOfXiaoMing shiyou=new KeyOfXiaoMing();   //这个代表室友的寝室钥匙
		//使用室友的寝室钥匙为小明配钥匙
		key=shiyou.clone();
		key.show();
		shiyou.show();
		
	}
}

案例分析

在上面的案例中我们通过了使用小明室友的寝室钥匙实现了为小明自己配钥匙的情况,这里的关键是我们可以通过一把钥匙不断的去创建另一把钥匙(通过一个对象实例不断创建相同的对象实例),而不需要根据钥匙的模具去创建对应的钥匙(通过new的方法,即通过类来创建相应的对象),而且我们在配钥匙处使用的抽象原型类对象引用来指向对于的具体原型类对象,实现了面对接口编程,提高了拓展性。

如果这个时候小明的同学小光他的钥匙也掉了,他同样需要配钥匙,我们所需要做得工作是增加一个具体原型类(注意小明的寝室钥匙和小刚的寝室钥匙不能通过同一个方法来配,他们的寝室钥匙不一致,只是同属于钥匙),然后在配钥匙处通过小光室友的钥匙为小光进行配钥匙。

另外在使用原型模式中我们应当知道浅拷贝和深拷贝的概念(因为对当我们将对象进行拷贝时可能会涉及到深拷贝和浅拷贝)
深拷贝:相当于共用一块内存,使用这块内存的所有对象会相互造成影响。
浅拷贝:相当于将一块内存中的值复制到另一块内存中进行使用,两者之间对数据的操作不会相互影响。
在原型模式中我们对于8中基本类型的拷贝是我们可以直接复制,但是对于其他的类型比如其他引用类型我们需要使用深拷贝来将实现完全的拷贝对象。

原型模式的优缺点

优点:

  1. 使得对象的创建过程更简单(比较适合需要将一个对象不断进行拷贝)——这也是原型模式的最主要特点。
  2. 提高了程序的可拓展性——我们使用抽象的原型类对象引用来指向对应的具体原型类对象实例,如果我们需要更改具体原先类对象,我们不需要更改引用。

缺点:

如果该对象的创建涉及比较多的引用类型,则拷贝方法的实现将会比较复杂,增加了类的复杂度。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值