设计模式—创建型—原型模式

创建性模式有五种:

1.工厂模式
    ①简单工厂模式(经常被用到,不属于GoF23种设计模式)
    ②工厂方法模式
    ③抽象工厂模式
2.建造者模式
3.原型模式
4.单例模式

原型模式

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

角色

①简单形式的原型模式

抽象原型:通常由接口或者抽象类组成,此角色给出所有原型所需要的接口。

具体原型:被复制对象,此角色通常要实现所有抽象原型所要求的接口

②登记形式的原型模式

抽象原型:通常由接口或者抽象类组成,此角色给出所有原型所需要的接口。

具体原型:被复制对象,此角色通常要实现所有抽象原型所要求的接口

原型管理器:创建具体的原型类对象,并记录每一个被创建的对象

优缺点

优点:

1、如果创建新的对象比较复杂时,可以利用原型模式简化对象的创建过程,同时也能够提高效率。
2、可以使用深克隆保持对象的状态。
3、原型模式提供了简化的创建结构。

缺点:

1、在实现深克隆的时候可能需要比较复杂的代码。
2、需要为每一个类配备一个克隆方法,而且这个克隆方法需要对类的功能进行通盘考虑,这对全新的类来说不是很难,但对已有的类进行改造 时,不一定是件容易的事,必须修改其源代码,违背了“开闭原则”。

类图

①简单形式的原型模式

②登记形式的原型模式

代码:

简单的原型模式

package com.sun.prototype;

public interface Prototype extends Cloneable{
	
		abstract Prototype clone()  throws CloneNotSupportedException;
}

 

package com.sun.prototype;

public class Resume implements Prototype{
	
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
	@Override
	public String toString() {
		return "Resume [name=" + name + "]";
	}

	public static void main(String[] args) throws CloneNotSupportedException {
		Resume r1 = new Resume();
		r1.setName("xxx");
		Resume r2 = (Resume) r1.clone();
		r2.setName("www");
		System.out.println("r1:"+r1);
		System.out.println("r2:"+r2);
	}

	@Override
	public Prototype clone() throws CloneNotSupportedException {
		return (Prototype) super.clone();
	}
	
}

登记原型模式只要再简单原型模式基础上增加原型管理器:

package com.sun.prototype;

import java.util.Vector;

public class PrototypeManager {
	private Vector<Prototype> v = new Vector<Prototype>();
	
	public void add(Prototype p) {
		v.add(p);
	}
	
	public Prototype get(int i) {
		return v.get(i);
	}
	
	public int size() {
		return v.size();
	}
	
	public static void main(String[] args) throws CloneNotSupportedException {
		PrototypeManager pm = new PrototypeManager();
		Resume p = new Resume();
		p.setName("xxx");
		pm.add(p);
		Resume p2 = (Resume) p.clone();
		p2.setName("www");
		pm.add(p2);
		System.out.println((Resume)pm.get(0));
		System.out.println((Resume)pm.get(1));
	}
}

简单形式和登记形式各有所长,如果创建对象较少,且比较固定可采用简单形式,如果创建对象数目不固定则可采用第二种,在这种情况下客户端不需要保存对原型对象的应用,由原型管理器统一保存,在复制一个原型对象之前,客户端查看是否有满足条件的原型对象,如果有直接获取,没有则自行复制。
 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值