原型模式的应用场景_原型化开发方法

原型模式的应用场景_原型化开发方法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/168509.html原文链接:https://javaforall.net

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


相关推荐

  • 国内可用的Internet时间同步服务器地址(NTP时间服务器)[通俗易懂]

    国内可用的Internet时间同步服务器地址(NTP时间服务器)[通俗易懂]不知道什么鬼我这系统自带的Internet时间同步服务器地址居然不可用,终端ping系统自带服务器两个居然都不通???难道时间服务器也和谐么?好在阿里云提供了7个NTP时间服务器也就是Interne

    2022年7月1日
  • java和mysql实现学生成绩管理系统(学生信息管理系统课程设计)

    Java+MySQL实现学生管理系统实现一个学生管理系统,方便老师对学生信息进行统计管理用户登录功能学生管理功能完善界面交互数据持久可靠设计思路使用Java作为开发语言,MySQL作为数据库,JavaSwing做图形界面;分层解耦,分为entity(实体层,映射数据库具体表)、dal(数据库访问,对数据库工具类封装)、dao(持久层,同数据库交互)、gui…

    2022年4月12日
  • Linux命令-1:tail命令详解

    Linux命令-1:tail命令详解由于测试过程中经常需要实时查看Tomcat日志,所以要掌握tail命令的用法。将平时用到的在此记录汇总一下。实时打印文件内容tail-ffilename显示文件的最后10行tailfilename显示文件最后20行tail-n20filename显示文件从第10行开始以后的内容tail-n+10filename显示文件最后10个字符…

    2022年6月3日
  • Java中Map的使用

    Java中Map的使用

    2021年12月5日
  • Oracle列转行函数 Listagg() 语法详解及应用实例「建议收藏」

    Oracle列转行函数 Listagg() 语法详解及应用实例「建议收藏」工作中用到一段比较复杂的SQL查询脚本,使用了listagg()函数实现了具有多个值的字段的填充(即,列表聚合,listaggregation(我猜的))。说简单点,listagg()函数可以实现多列记录聚合为一条记录,从而实现数据的压缩、致密化(datadensification)。以下内容转载自http://dacoolbaby.iteye.com/blog/1698957,SQL脚本做了…

    2022年9月3日
  • vi/vim复制粘贴命令[通俗易懂]

    vi/vim复制粘贴命令[通俗易懂]1.选定文本块。使用v进入可视模式,移动光标键选定内容。2.复制的命令是y,即yank(提起),常用的命令如下:   y     在使用v模式选定了某一块的时候,复制选定块到缓冲区用;   yy   复制整行(nyy或者yny,复制n行,n为数字);   y^  复制当前到行头的内容;   y$   复制当前到行尾的内容;   yw  复制一个word(nyw或者ynw,复制n个word,n为数字);  

    2022年9月22日

发表回复

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

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