设计模式 -- Prototype(原型模式)

原型模式(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方法也可以实现深拷贝

posted @   鐡道  阅读(40)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示