两种语言实现设计模式(C++和Java)(七:原型模式)
参考:https://www.cnblogs.com/carsonzhu/p/5774616.html
尽管和工厂模式相类似是创建型设计模式的一种,原型模式本身与工程设计模式本身并没有什么关系,该模式的思想就是将一个对象作为原型,对其进行复制、克隆,产生一个和原对象类似的新对象。
原型模式的应用场景:
1.当我们的对象类型不是开始就能确定的,而这个类型是在运行期确定的话,那么我们通过这个类型的对象克隆出一个新的对象比较容易一些;
2..有的时候,我们需要一个对象在某个状态下的副本,此时,我们使用原型模式是最好的选择;例如:一个对象,经过一段处理之后,其内部的状态发生了变化;这个时候,我们需要一个这个状态的副本,如果直接new一个新的对象的话,但是它的状态是不对的,此时,可以使用原型模式,将原来的对象拷贝一个出来,这个对象就和之前的对象是完全一致的了;
3.当我们处理一些比较简单的对象时,并且对象之间的区别很小,可能就几个属性不同而已,那么就可以使用原型模式来完成,省去了创建对象时的麻烦了;
4.有的时候,创建对象时,构造函数的参数很多,而自己又不完全的知道每个参数的意义,就可以使用原型模式来创建一个新的对象,不必去理会创建的过程。
一.C++代码
1 #include <iostream> 2 3 using namespace std; 4 5 class IPrototype{ 6 public: 7 IPrototype(){} 8 virtual ~IPrototype(){} 9 virtual IPrototype* clone()=0; 10 }; 11 12 class ConcretePrototype:public IPrototype 13 { 14 private: 15 int m_counter; 16 public: 17 ConcretePrototype(){ 18 m_counter = 0; 19 } 20 21 //拷贝构造函数 22 ConcretePrototype(const ConcretePrototype& rhs){ 23 m_counter = rhs.m_counter; 24 } 25 26 virtual ~ConcretePrototype(){} 27 28 virtual ConcretePrototype* clone(){ 29 m_counter ++; 30 return new ConcretePrototype(*this); 31 } 32 33 int getCounter(){ 34 return m_counter; 35 } 36 }; 37 38 int main() 39 { 40 ConcretePrototype* c1 = new ConcretePrototype(); 41 cout<<"当前拷贝次数"<<c1->getCounter()<<endl; 42 ConcretePrototype* c2 = c1->clone(); 43 cout<<"当前拷贝次数"<<c1->getCounter()<<endl; 44 cout<<"当前拷贝次数"<<c2->getCounter()<<endl; 45 return 0; 46 }
二.Java代码
Java实现原型模式很简单,只需要实现cloneable接口的类都可以作为原型类,其中clone方法可以由开发者重写
1 public class Prototype implements Cloneable { 2 3 private int counter; 4 5 @Override 6 public Prototype clone() throws CloneNotSupportedException { 7 counter++; 8 return (Prototype) super.clone(); 9 } 10 11 public int getCounter(){ 12 return this.counter; 13 } 14 15 } 16 17 public class Main { 18 19 public static void main(String[] args) { 20 try{ 21 Prototype prototype1 = new Prototype(); 22 System.out.println("当前拷贝次数" + prototype1.getCounter()); 23 Prototype prototype2 = prototype1.clone(); 24 System.out.println("当前拷贝次数" + prototype1.getCounter()); 25 System.out.println("当前拷贝次数" + prototype2.getCounter()); 26 } catch (CloneNotSupportedException e){ 27 e.printStackTrace(); 28 } 29 } 30 }
输出:
当前拷贝次数0
当前拷贝次数1
当前拷贝次数1
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具