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

原型模式的应用场景_原型模式深浅克隆区别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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • DrawImage方法详解(转载)

    DrawImage方法详解(转载)Image和Bitmap类概述GDI+的Image类封装了对BMP、GIF、JPEG、PNG、TIFF、WMF(Windows元文件)和EMF(增强WMF)图像文件的调入、格式转换以及简单处理的功能。

    2022年7月1日
    23
  • 排序算法汇总总结

    排序算法汇总总结

    2021年12月2日
    47
  • RGB-D(深度图像) & 图像深度「建议收藏」

    RGB-D(深度图像) & 图像深度「建议收藏」RGB-D(深度图像)  深度图像=普通的RGB三通道彩色图像+DepthMap  在3D计算机图形中,DepthMap(深度图)是包含与视点的场景对象的表面的距离有关的信息的图像或图像通道。其中,DepthMap类似于灰度图像,只是它的每个像素值是传感器距离物体的实际距离。通常RGB图像和Depth图像是配准的,因而像素点之间具有一对一的对应关系

    2022年5月28日
    32
  • Android 开机动画源码分析

    Android 开机动画源码分析Android系统在启动SystemServer进程时,通过两个阶段来启动系统所有服务,在第一阶段启动本地服务,如SurfaceFlinger,SensorService等,在第二阶段则启动一系列的Java服务。开机动画是在什么时候启动的呢?通过查看源码,Android开机动画是在启动SurfaceFlinger服务时启动的。SystemServer的main函数首先调用init1来启动本地服务,

    2022年5月15日
    36
  • RelativeLayout中子控件改变layoutParams无效

    RelativeLayout中子控件改变layoutParams无效布局代码:

    2022年7月17日
    10
  • JavaAPI学习-入门

    JavaAPI学习-入门1、JavaAPI概述API(ApplicationProgramingInterface):应用程序编程接口,是java提供的一些预定义的函数。目的:基于API实现程序的快速编写。只需了解实现的作用,无需关注源代码。JavaAPI通常是一些基础、通用的基础类库,通过这些基础的类库,可以构造复杂的功能。JavaAPI在线文档:https://tool.oschina.net/apidocs/apidoc?api=jdk-zh1.1、如何学习针对一个API首先看概述,了解类的作用,然后看

    2022年7月8日
    24

发表回复

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

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