首页 > 其他分享 >设计模式 -- Prototype(原型模式)

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

时间:2022-09-27 15:33:51浏览次数:67  
标签:splitter Prototype -- clone ISplitter Override 设计模式 public

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

标签:splitter,Prototype,--,clone,ISplitter,Override,设计模式,public
From: https://www.cnblogs.com/tie-dao/p/16734721.html

相关文章

  • 看不懂(2)啊哈C第七章第七节
    #include<string.h>#include<stdio.h>#include<stdlib.h>intmain(void){chara[5][11],t[11];inti,j;for(i=0;i<=4;i++){gets(a[i]);fo......
  • django rest-framework 自定义异常捕获类
    djangorest-framework自定义异常捕获类环境:django3.2python3先创建文件exceptions.py(文件名称可以自定义)1、重写exception_handler,自定义异常类#-*-coding:ut......
  • Java中代码块的理解
    静态、实例代码块静态代码块,在类加载之前会加载一次,可以用来初始化静态资源实例代码块,每次调用构造器初始化对象的时候,都要执行一次。其实质是放到构造器方法中执行。可......
  • File 文件地址转换相关方法
    1.网络资源转File需要引入依赖commons-io/***读取网络中的图片*@paramurlhttps://www.kziyue.com/wp-content/uploads/2019/06/5bca-hxyuaph982561......
  • 通关基本算法 day_08 -- 位运算
    求整数n二进制表示里,第k位数字是几?$$n=15=(1111)_2$$先把第k位移到最后一位n>>k看个位是几x&1总结:n>>k&1例子例如输出10的二进制表达#includ......
  • ansible 安装jdk
    1、上传文件到ansible端上/data/jdk/jdk-8u341-linux-x64.tar.gz(下载地址:)2、编辑jdk.yml文件vimjdk.yml【----hosts:192.168.59.103 remote_user:root tasks......
  • flask-多app应用
    flask多app应用1、安装werkzeugpip3installwerkzeug==0.16.02、实例fromwerkzeug.wsgiimportDispatcherMiddlewarefromwerkzeug.servingimportrun_simple......
  • 考察交互的方差分析与简单效应分析(附带操作数据)
    1.案例背景与分析策略1.1案例背景介绍治疗缺铁性贫血病人12例,分4组给予基础疗法和甲乙两种药物治疗,一个月后观察红细胞增加数(百万/mm),试分析甲乙用药对治疗效果的影响。......
  • 小程序接口请求的初次封装
    我们在写微信小程序中不管是用原生的微信开发者工具还是用uniapp来开发都需要用到数据的请求,在页面中大量的使用请求无疑会造成代码的冗余,也会给后期的维护带来很大的难......
  • 1:python3环境搭建和PyCharm配置
    python官网----https://www.python.org/1.查看历史版本2。下载指定的历史版本.   3.安装python  4.安装到指定目录(先创建一个python3的目录)  5修改......