大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新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克隆的步骤过于复杂
- 什么时候使用原型?如果可以通过简单步骤创建出来对象则使用工厂模式 否则使用原型模式
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/168509.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...