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

原型模式的应用场景_原型化开发方法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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 基于51单片机的步进电机的控制

    基于51单片机的步进电机的控制前面笔者分享过基于51单片机的两种小车制作,我们利用的是L298N驱动控制电机转动,那么接下来,笔者给大家介绍两种利用51单片机控制步进电机的小程序。首先我们要如何使电机转动呢,源程序如下:#include<reg52.h>unsignedcharcodeF_Rotation[4]={0x02,0x04,0x08,0x10};//正转表格,换算成二进制00…

    2022年5月31日
    31
  • 为什么 select count(*) from t,在 InnoDB 引擎中比 MyISAM 慢?

    为什么 select count(*) from t,在 InnoDB 引擎中比 MyISAM 慢?

    2022年2月14日
    39
  • 生成模型_常见的模型生成方式

    生成模型_常见的模型生成方式(一)生成模型简介1、什么是生成模型在概率统计理论中,生成模型是指能够在给定某些隐含参数的条件下,随机设工程观测数据的模型,他给观测值和标测数据序列指定一个联合概率分布,在机器学习中,生成模型可以

    2022年8月1日
    6
  • ArcGIS Api For Flex 动态画点和线

    ArcGIS Api For Flex 动态画点和线

    2022年3月4日
    41
  • 【工作笔记】PathFileExists 返回 FALSE

    【工作笔记】PathFileExists 返回 FALSE问题描述:在参数传递正确,文件确实存在的情况下,PathFileExists偶尔返回FALSE解决思路:1、首先,由于是网络路径,所以system用户使用文件操作类函数(比如PathFileExists、GetFileAttributesEx等)时需要切token2、在切token并成功的情况下,发现依然会偶尔返回FALSE,打印错误码,有拒绝访问和文件不存在两种情况3、使用P…

    2022年7月12日
    21
  • C语言学生成绩管理系统详解[通俗易懂]

    文章目录一、系统概述二、数据类型三、自定义函数说明四、运行界面五、源代码源代码请直接跳到最后引言:最近写了C语言的大作业,感觉做得还行,记录一下,给后人一些参考,给自己留更深印象方便后续改进!不知道发了这篇博客会不会认为我抄袭…害怕.jpg一、系统概述使用单向链表和文件作为基本数据结构,设计一个学生成绩管理程序,管理某学校学生成绩。[1]插入数据[2]修改对应数据项的数据[3]删除对应学号的信息[4]查找某学号的信息[5]查找不及格学生[6]对学生成绩进行排名[7]统计各个等级的学生

    2022年4月11日
    55

发表回复

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

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