原型模式的应用场景_原型模式深浅克隆区别

原型模式的应用场景_原型模式深浅克隆区别ProtoType 原型模式动机模型定义实例结构要点总结笔记动机在软件系统中,经常面临着”某些结构复杂的对象“的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是它们却拥有比较稳定一致的接口如何应对这种变化?如何向”客户程序“(使用这些对象的程序)”隔离出“这些易变对象,从而使得”依赖这些易变对象的客户程序“不随着需求变化而变化?模型定义使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新对象。实例和工厂模型用的同一个实例工厂模式//工厂class SplitterF

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

动机

在软件系统中,经常面临着”某些结构复杂的对象“的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是它们却拥有比较稳定一致的接口

如何应对这种变化?如何向”客户程序“(使用这些对象的程序)”隔离出“这些易变对象
,从而使得”依赖这些易变对象的客户程序“不随着需求变化而变化?

模型定义

使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新对象

实例

和工厂模型用的同一个实例
工厂模式

//工厂
class SplitterFactory{ 
   
    public:
    virtual ISplitter* CreateSplitter() = 0;
    ~SplitterFactory(){ 
   };
}
//抽象类
class ISplitter{ 
   
public:
    virtual void split() = 0;
    virtual void ~ISplitter(){ 
   }
}

//具体类
class FileSpliter : ISplitter{ 
   
    
}

class TxtSpliter : public ISplitter{ 
   

};

class BinarySplitter : public ISplitter{ 
   

};

//具体工厂
BinarySplitterFactory : public SplitterFactory{ 
   
public :
    virtual ISplitter *CreateSplitter(){ 
   
        return new BinarySplitter()
    }
}

class MainForm : public Form{ 
   
    TextBox * txtFilaPath;
    TextBox * txtFileNumber;

    ProgressBar *progressBar;

    SplitterFactory * factory;//工厂
public :
    MainForm(SplitterFactory *factory){ 
   
        this->factory = factory;
    }
    void Button_Click(){ 
   
        string filePath = txtFilaPath->getText();
        int number = atoi(txtFileNumber->getText());

        ISplitter *splitter =  factory->CreateSplitter();   //多态new

        splitter.split();
    }
}

原型模式


//抽象类
class ISplitter{ 
   
public:
    virtual void split() = 0;
    virtual void ~ISplitter(){ 
   }
    virtual ISplitter* CreateSplitter() = 0;
}
//具体类
class FileSpliter : ISplitter{ 
   
public :
    virtual ISplitter *clone(){ 
   
        return new FileSpliter()
    }
}

class TxtSpliter : public ISplitter{ 
   
public :
    virtual ISplitter *clone(){ 
   
        return new TxtSpliter()
    }
};

class BinarySplitter : public ISplitter{ 
   
public :
    virtual ISplitter *clone(){ 
   
        return new BinarySplitter()
    }
};

class MainForm : public Form{ 
   
    TextBox * txtFilaPath;
    TextBox * txtFileNumber;

    ProgressBar *progressBar;

    ISplitter * prototype;//工厂
public :
    MainForm(SplitterFactory *prototype){ 
   
        this->prototype = prototype;
    }
    void Button_Click(){ 
   
        string filePath = txtFilaPath->getText();
        int number = atoi(txtFileNumber->getText());

        ISplitter *splitter =  prototype->clone();   //多态new

        splitter.split();
    }
}

结构

在这里插入图片描述

要点总结

  • prototype模式同样用于隔离类对象的使用者和具体类型(易变类)之间的耦合关系,它同样要求这些”易变类“拥有”稳定的接口“
  • Prototype模式对于”如何创建易变类的实体对象“采用”原型克隆“的方法来做,它使得我们可以非常灵活地动态创建”拥有某些稳定接口“地新对象–所需工作仅仅是注册一个新类地对象(即原型),然后在任何需要地地方Clone
  • Prototype模式中地Clone方法可以利用某些框架中地序列化实现深拷贝

笔记

  • 通过克隆自己创建对象
  • 从形式上看是将工厂设计模式种 将工厂和抽象类 合并起来
  • 跟工厂方法的区别是 ”复杂对象“ 它的初始状态又不是自己想要的 这时候如果有一个对象如果已经达到比较好的状态 使用clone()方法把他的状态给克隆出来
  • 传入的对象状态是什么 克隆出来的状态机就是什么 避免了用factory克隆的步骤过于复杂
  • 什么时候使用原型?如果可以通过简单步骤创建出来对象则使用工厂模式 否则使用原型模式
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/169040.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 《可复制的领导力》思维导图读书笔记,提升职场竞争力[通俗易懂]

    《可复制的领导力》思维导图读书笔记,提升职场竞争力[通俗易懂]身在职场中的我们,很多人都为缺乏领导力而头痛,羡慕那些成功领导者所具备的领导力。但几乎所有人都认为领导力是一种感觉,是一门很深奥的学问,是经过许多年去锻炼出来的,是学不会的。王侯将相,宁有种乎?小编现在想告诉大家,其实领导力的方法与技巧,每个人都可以通过学习来掌握,不论是看书也好,看视频也罢。都是可以的。即便你不是领导,也同样需要领导力,因为这可以在社会彰显你的价值。下面通过MindMaster思维导图走进樊登老师的著作里,去学习和掌握领导力的一些方法与技巧。(注:本图由MindMaster导图

    2022年6月17日
    32
  • Java学习之final与匿名内部类篇

    Java学习之final与匿名内部类0x00前言续上几篇文章,得知子类继承父类后是可以在父类的基础上进行改写的,那么在程序中有些东西可能是不能让我们给轻易给改动的,那么Java给提供了final

    2021年12月11日
    54
  • nmap命令的详解

    nmap命令的详解使用-sP参数对对应主机段的主机发送ICMP报文,可以查询到哪些主机是存活的。[root@localhost~]#nmap-sP192.168.8.0/24StartingNmap6.40(http://nmap.org)at2018-07-1014:32CSTNmapscanreportfor192.168.8.0Hostisup(0….

    2022年5月8日
    46
  • ora00279解决办法_oracle物化视图日志表

    ora00279解决办法_oracle物化视图日志表某物化视图在增量刷新的时候报错ora-00920,尝试全量刷新的时候,报错ora-00904。BEGINDBMS_MVIEW.REFRESH(‘MV_ABCD_K_PPLLCJ’,’F’);END;ORA-12018:在创建”MYJUKKA”.”MV_ABCD_K_PPLLCJ”的代码时出现以下错误ORA-00920:无效的关系运算符ORA-06512:在”SYS.SNAPSHOT”,line…

    2022年9月20日
    0
  • 2021 3.1 idea 破解激活码[在线序列号][通俗易懂]

    2021 3.1 idea 破解激活码[在线序列号],https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月19日
    141
  • 解决:java.lang.UnsupportedClassVersionError「建议收藏」

    解决:java.lang.UnsupportedClassVersionError「建议收藏」问题: java.lang.UnsupportedClassVersionError: xxxxx Unsupported major.minor version 52.0启动Tomcat时出现这种错误。造成这种错误的原因是你的Tomcat运行的JDK版本与支持application运行的JDK版本不一致导致的。解决方法: 1、Window—&gt…

    2022年6月13日
    37

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号