原型模式(Prototype)
使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象。
在软件系统中,经常面临着“某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是他们却拥有着比较稳定一直的接口。
假设将工厂模式中的ISplitter和SplitterFactor两个基类进行合并。并添加一个克隆自己的方式来构建对象的虚方法。使用的时候应该是通过原型对象构造的对象来clone出所需要的对象。
//抽象类
abstract class ISplitter {
public ISplitter() {}
protected ISplitter(ISplitter splitter) {}
public abstract void split();
public abstract ISplitter clone(); //通过克隆自己来创建对象
};
//具体类
class BinarySplitter extends ISplitter{
public BinarySplitter() {}
protected BinarySplitter(ISplitter splitter) {
super(splitter);
}
@Override
public void split() {
}
@Override
public ISplitter clone(){
return new BinarySplitter(this);
}
};
class TxtSplitterimplements extends ISplitter{
public TxtSplitterimplements() {}
protected TxtSplitterimplements(ISplitter splitter) {
super(splitter);
}
@Override
public void split() {
}
@Override
public ISplitter clone(){
return new TxtSplitterimplements(this);
}
};
class PictureSplitter extends ISplitter{
public PictureSplitter() {}
protected PictureSplitter(ISplitter splitter) {
super(splitter);
}
@Override
public void split() {
}
@Override
public ISplitter clone(){
return new PictureSplitter(this);
}
};
class VideoSplitter extends ISplitter{
public VideoSplitter() {}
protected VideoSplitter(ISplitter splitter) {
super(splitter);
}
@Override
public void split() {
}
@Override
public ISplitter clone(){
return new VideoSplitter(this);
}
};
public class Prototype {
// 原型对象
private ISplitter prototype;
public Prototype(ISplitter prototype) {
this.prototype = prototype;
}
@Test
public void T1() {
ISplitter splitter = prototype.clone();
// 执行分割
splitter.split();
}
}
这时候有一个问题,就是原型模式通过克隆的方式获得对象的目的到底是什么呢?这样能够解决什么样的问题呢?
对于某些结构复杂的对象的创建。在某些状态下的工厂会变得比较复杂,并且,创建出来的对象不一定是我们想要的,那么我们只需要使用clone方法就可以得到我们需要的对象。
那么简单一句话就是:本就是你需要从A的实例得到一份与A内容相同,但是又互不干扰的实例的话,就需要使用原型模式。
总结
Prototype模式同样用于隔离类对象的使用者和具体类型(易变类)直接的耦合关系,他同样要求这些“易变类”拥有“稳定的接口”。
Prototype模式对于“如何创建易变类的实体对象”采用“原型克隆”的方法来做,它使得我们可以非常灵活地“动态创建”拥有某些稳定接口的新对象——所需工作仅仅是注册一个新类的对象(即原型),然后在任何需要的地方clone。
Prototype模式中的Clone方法也可以实现深拷贝