原型模式:也是一种创建型模式,它关注的是系统中需要创建大量对象,但对象之间有很多相似之处或者对象基本相同。
原型模式有两种不同的实现:1、简单形式 2、登记形式
一、简单形式
public interface Prototype{ public Object clone(); } public class P1 implements Prototype{ public Prototype clone(){ Prototype p=new P1; return p; } } public class P2 implements Prototype{ public Prototype clone(){ Prototype p=new P2(); return p; } }
//客户端 public class client{ Prototype prototype; public client(Prototype prototype){ this.prototype=prototype; } //clone public void opration(){ Prototype p=prototype.clone(); } }
二、登记形式 多一个原型管理器(PrototypeManger),作用是记录每个创建的对象。
public class PrototypeManager(){ private static Map<String ,Prototype> prototypeMap=new HashMap<String,Prototype>(); private PrototypeManager(){ } public synchronized static Prototype getPrototype(String key){ return prototypeMap.get(key); } public synchronized static void setPrototype(String key,Prototype p){ prototypeMap.put(key,p); } }
//客户端 public class client{ Prototype p1=new xxxPrototype();//只是一个实现 PrototypeManager.setPrototype("p1",p1); //clone Prototype p2=PrototypeManager.getPrototype("p1").clone(); }
简单形式用于单一少量的对象创建上.
登记形式:原型对象数量不固定,或者原型对象在管理器中已经拥有满足要求的原型对象。
clone方法的两种克隆方式:浅克隆和深克隆
浅克隆:不包含对象中引用对象的克隆。只针对(String和基本类型的克隆)。
深克隆:包含对引用对象的,深层引用对象的克隆,注意循环引用的处理。
一、浅克隆:java中实现Cloneable接口,就是一个浅克隆.注:实现Cloneable接口是为了标注为一个可克隆对象。
public class Computer implements Cloneable{ private String name; public Object clone(){ try{ return super.clone(); }catch(CloneNotSupportedException e){ return null; } } } //调用 Computer c=new Computer(); Computer x=c.clone();
二、深克隆:经过对象的序列换与反序列化实现。
public Object deepClone() throws IOException,ClassNotFoundException{ //将对象写入流 ByteArrayOutputSteam bos=new ByteArrayOutputStream(); ObjectOutoutStream oos=new ObjectOutputStream(bos); oos.writeObject(this); //从流中读取对象 ByteArrayInputSteam bis=new ByteArrayInputStream(bos); ObjectInputStream ois=new ObjectInputStream(bis); return ois.readObject(ois); }
这样写的前提是类中的引用对象都是可序列化的,把不能序列化的对象注解@transient。
应用场景:1、当多个调用者要修改一个对象时。
2、当一个对象有很多引用对象,使用clone的效率会高于new。因为在内存中把已有的对象用流输出。
3、有一些对象,比如线程(Thread)对象或Socket对象,是不能简单复制或共享的。不管是使用浅度克隆还是深度克隆,只要涉及这样的间接对象,就必须把间接对象设成transient而不予复制;或者由程序自行创建出相当的同种对象,权且当做复制件使用。
相关推荐
设计模式之原型模式prototype有更多需要请联系我wyb_jany@126.com
NULL 博文链接:https://hnzhoujunmei.iteye.com/blog/1032892
Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。...
原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
NULL 博文链接:https://wy649898543.iteye.com/blog/1431591
设计模式C++学习之原型模式(Prototype)
主要介绍了PHP设计模式:原型模式Prototype,结合实例形式详细分析了PHP原型模式Prototype的基本概念、功能、原理、实现方法与操作注意事项,需要的朋友可以参考下
23种设计模式之Prototype模式代码,这是自己学习Prototype模式顺带写的代码,仅供学习交流
6、原型模式(Prototype Pattern) 用意:通过拷贝创建一个新的对象
原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
一个原型设计模式的应用案例,C#语言编写,有助于设计模式的理解和学以致用。
IOS设计模式浅析之原型模式(Prototype)--copy - iOS知识库1
原型模式的示例代码和文档,学习原型模式的参考资料。
NULL 博文链接:https://gary0416.iteye.com/blog/904124
设计模式之Prototype
原型模式是一种创建型设计模式,它通过复制一个现有的对象来创建新的对象,而不是通过调用构造函数的方式。这种方式可以在运行时动态地创建和修改对象,而不需要知道具体的创建细节 。 原型模式的基本概念包括以下...
并且通过拷贝这个原型来创建新的对象 * */ abstract class Prototype { private $_id = null; public function __construct($id) { $this->_id = $id; } public function getID() { return $this->_id; } public ...
设计模式 Prototype 模式 原型模式 这里筹够20个字符
3.设计模式Design Pattern:创建型模式(厂模式Factory、抽象工厂模式Abstract Factory、单例模式Singleton、建造者模式Builder、原型模式Prototype和对象池模式Object Pool Pattern)、结构型模式(适配器模式、...